我在/tmp/
下创建了两个目录:A和B.
我想将每个目录名作为参数传递给shell脚本,并在所述目录中执行一些命令,如下面的脚本所示:
#!/bin/sh
if [ ! -z "$1" ]
then
cd /tmp/$1
pwd
ls
fi
现在我想阻止脚本在给定的参数不是A或B时执行。也就是说,在尝试运行./script.sh C
时,它应该产生类似invalid parameter
的内容。
如何测试变量的内容是否在允许值集合中?
答案 0 :(得分:2)
if [[ "$1" -eq "A" || "$1" -eq "B" ]] #mind the spaces
then
#Do something useful here
fi
应该这样做。有关[[ ]]
的更多信息,请参阅[ this ]发布。
如果您想将接受的参数限制为列表,请执行此操作
array=("file1" "file with space" "file3" "file4" "an so on") # Your allowed parameter list
if echo -e "${array[@]/%/\\n}" | grep "$1"
then
#Do something useful
fi
备注强>
echo -e
是默认行为。检查[ this ]。换句话说,echo -e
是基础。 请注意,您在ksh中需要echo -e
以及我在ksh 93u+
中确认help echo
说:
-e启用以下反斜杠转义的解释
答案 1 :(得分:2)
这可以通过多种方式完成。我会用的是:
valid_vals="dir1 dir2 dir3 dir4" #space separated valid values.
#first check if command line arg is empty or within specifications; then,
#check if it falls within valid values as below:
if [ $(echo $valid_vals | grep -w ${1} | wc -l) -eq 1 ]; then
echo "Valid input"
else
echo "Invalid input"
fi
这样,您可以将所有有效值定义为空格分隔值。该方案可以根据进一步的要求进行更改 好处:您可以将列表保持外部化,并且在目录列表更改时无需触摸脚本。
答案 2 :(得分:0)
将您的if条件更改为
if["$1"=="A" || "$1"=="B"]
答案 3 :(得分:0)
如果要测试更多值,请使用开关:
case "$1" in
"") echo "\$1 is missing";;
A) echo "Ok, A";;
B) echo "Ok, B";;
C|D) echo "C and D also allowed" ;;
*) echo "Nope";;
esac