[英]Detect number of argument and the value passed into the bash
我想确保我的bash脚本可以正确检测用户的输入参数。 具体来说,用户只能将1或2或3传递给脚本,否则脚本将被终止。 我写了以下代码:
#!/bin/bash
for args in $@
do
echo $args
done
if [ "$#" != 1 ] && [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
exit 1
fi
该脚本只能在用户不输入任何内容时捕获,而不能检查用户是否确实输入了数字1而不输入其他值。
顺便说一下,我不确定如何表达“输入参数可以接受数字1或2或3”。
$#
是整数,因此您必须使用整数比较。 例如,您可以说:
if [ "$#" -ne 1 ]; then
echo "illegal number of parameters"
exit 1
fi
要检查参数是1、2还是3,可以使用以下正则表达式(请参阅相关内容 ):
if [[ ! $1 =~ ^(1|2|3)$ ]]; then
echo "the number is not 1, 2 or 3"
exit 1
fi
为了表达“输入参数可以接受数字1或2或3”,我可以说“我们可以接受参数是1、2或3”。
首先,您可以通过执行以下操作来检测字符串是空还是空:
if [ -z "$1" ]
then
echo "Argument $1 contains nothing"
fi
我想说这是您的第一步,它将允许您过滤出不包含任何内容的args。
然后,您很可能需要对$ 1,$ 2和$ 3进行一些比较工作
我将检查一下,稍后再返回。
只是不得不去找到我的脚本之一并检查一下... :-)
我过去处理过Parm检查的一种方式是如下所示
#!/bin/sh
while [ $# -gt 0 ] || [ "$#" -le 4 ]; do
case "$1" in
*[!1-9]*) echo "Text: $1";;
*) echo "Number: $1"
esac
case "$2" in
*[!1-9]*) echo "Text: $2";;
*) echo "Number: $2"
esac
case "$3" in
*[!1-9]*) echo "Text: $3";;
*) echo "Number: $3"
esac
shift
done
基本上是一个简单的正则表达式,如果我有0个以上的参数或4个以下的参数,则可以将其允许通过case语句,然后检查每个参数的内容。
这个只是回声,但是您可以轻松设置一些标志,然后根据这些标志决定如何继续。
但是,对于简单的范围检查,您可能只想使用类似于以下内容的一根衬管:
if [[ $# -gt 0 && $# -lt 4 ]]; then echo "Correct number of parameters"; fi
再次设置标志以供以后使用而不是回显结果。
我假设您的意思是输入只能是1、2或3,所以使用case语句是最好的方法。 $ 1是存储参数的变量,如果等于1,则将在与值1对应的块中执行代码,依此类推。
case "$1" in
1) ...
;;
2) ...
;;
3) ...
;;
*) echo "Invalid argument"
;;
esac
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.