Arrays 如何测试变量';的内容在AIX ksh中的一组值中?

Arrays 如何测试变量';的内容在AIX ksh中的一组值中?,arrays,if-statement,ksh,aix,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时,它应该会生成类似无效参数的内容 如何测试变量的内容是否在允许的值集中?将if条件更改为 if["$1"=="A"

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

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

#!/bin/sh

if [ ! -z "$1" ]
then
        cd /tmp/$1
        pwd
        ls
fi
现在,我想防止在给定的参数不是A或B时执行脚本。也就是说,在尝试运行
/script.sh C
时,它应该会生成类似
无效参数的内容


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

将if条件更改为

if["$1"=="A" || "$1"=="B"]

将您的if条件更改为

if["$1"=="A" || "$1"=="B"]
我应该这样做。有关
[[]]
的更多信息,请参阅文章

如果要将接受的参数限制为列表,请执行以下操作

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
注释

  • 在符合POSIX标准的shell中,
    echo-e
    是默认行为。检查换句话说,
    echo-e
    就是巴什主义

  • 请注意,您需要ksh中的
    echo-e
    ,我已经在
    ksh 93u+
    中确认了
    帮助echo
    说明:

    -e启用以下反斜杠转义的解释

  • 我应该这样做。有关
    [[]]
    的更多信息,请参阅文章

    如果要将接受的参数限制为列表,请执行以下操作

    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
    
    注释

  • 在符合POSIX标准的shell中,
    echo-e
    是默认行为。检查换句话说,
    echo-e
    就是巴什主义

  • 请注意,您需要ksh中的
    echo-e
    ,我已经在
    ksh 93u+
    中确认了
    帮助echo
    说明:

    -e启用以下反斜杠转义的解释


  • 这可以通过多种方式实现。我会使用的一个方法是:

    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
    
    通过这种方式,可以将所有有效值定义为以空格分隔的值。该方案可根据进一步要求进行更改
    好处:您可以将列表外部化,并且在目录列表更改时无需触摸脚本。

    这可以通过多种方式完成。我会使用的一个方法是:

    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
    
    通过这种方式,可以将所有有效值定义为以空格分隔的值。该方案可根据进一步要求进行更改
    好处:您可以使列表外部化,并且在目录列表更改时无需触摸脚本。

    当您要测试更多值时,请使用开关:

    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
    

    要测试更多值时,请使用开关:

    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
    


    你的意思是:如何测试变量的内容是否在一组值中?在这里:?是的。假设我只需要将我定义的5个东西作为参数传递,而不是说不存在。你的意思是:如何测试变量的内容是否在一组值中?在这里:?是的。假设我只需要将我定义的5个东西作为参数传递,而不是说不存在。谢谢。让我试试。如果[“$1”==“A”| |“$1”==“B”]那么;cd/tmp/$1;pwd;ls else echo“Please pass valid name”fi--------------------------------------------------------------------我试图将AK作为参数传递给下面的代码。/test2.sh AK./test2.sh[3]:test:0403-021 A]字符缺失/test2.sh[3]:AK==A:未找到。请传递有效姓名谢谢你宝贵的时间。谢谢。让我试试。如果[“$1”==“A”| |“$1”==“B”]那么;cd/tmp/$1;pwd;ls else echo“Please pass valid name”fi--------------------------------------------------------------------我试图将AK作为参数传递给下面的代码。/test2.sh AK./test2.sh[3]:test:0403-021 A]字符缺失/test2.sh[3]:AK==A:未找到。请传递有效姓名谢谢您宝贵的时间。我们不必给您空间?@Rishu。IIRC空格分别在
    [[
    ]
    之后和之前是必填的。如果[“$1”==“A”| |“$1”==“B”],则;cd/tmp/$1;pwd;ls else echo“Please pass valid name”fi--------------------------------------------------------------------我试图将AK作为参数传递给下面的代码。/test2.sh AK./test2.sh[3]:test:0403-021 A]字符缺失/test2.sh[3]:AK==A:未找到。如果我提供了其他参数,同时也给出了其他结果,请传递有效名称及其抛出错误。为什么我得到的不仅仅是其他结果?谢谢你宝贵的时间。我们不必给空间?@Rishu。IIRC空格分别在
    [[
    ]
    之后和之前是必填的。如果[“$1”==“A”| |“$1”==“B”],则;cd/tmp/$1;pwd;ls else echo“Please pass valid name”fi--------------------------------------------------------------------我试图将AK作为参数传递给下面的代码。/test2.sh AK./test2.sh[3]:test:0403-021 A]字符缺失/test2.sh[3]:AK==A:未找到。如果我提供了其他参数,同时也给出了其他结果,请传递有效名称及其抛出错误。为什么我得到的不仅仅是别的结果?谢谢你宝贵的时间。看起来很有趣。让我试试../test7.sh[2]:分离:未找到。输入无效,其名称为:未找到。如果输入也正确。我正在使用AIX.point#1在Unix中(特别是在AIX中)不要创建带有空格的目录-ex:point#2正如我在回答中提到的,目的是向OP展示如何做,如果他希望目录带有空格,他应该更改
    valid
    @RishuA的分隔符。我在
    ksh
    中测试了这篇文章,它可以工作。介意发布您的test7.sh吗?如果这是AIX特定的问题,请考虑具体应用。tags@ringbearer当前位置这是一条并不总是遵循的指导方针。更好的选择是使用有效参数数组。看起来很有趣。让我试试../test7.sh[2]:分离:未找到。输入无效,其名称为:未找到。如果输入也正确。我使用的是AIX.point#1,不使用