如何测试变量的内容是否在AIX ksh中的一组值中?

时间:2016-06-07 08:27:22

标签: arrays if-statement ksh aix

我在/tmp/下创建了两个目录:A和B.

我想将每个目录名作为参数传递给shell脚本,并在所述目录中执行一些命令,如下面的脚本所示:

#!/bin/sh

if [ ! -z "$1" ]
then
        cd /tmp/$1
        pwd
        ls
fi

现在我想阻止脚本在给定的参数不是A或B时执行。也就是说,在尝试运行./script.sh C时,它应该产生类似invalid parameter的内容。

如何测试变量的内容是否在允许值集合中?

4 个答案:

答案 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

备注

  1. 在符合POSIX标准的shell中,echo -e是默认行为。检查[ this ]。换句话说,echo -e是基础。
  2. 请注意,您在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