【问题标题】:How to test if a variable's content is in a set of values in AIX ksh?如何测试变量的内容是否在 AIX ksh 的一组值中?
【发布时间】:2016-10-07 01:15:15
【问题描述】:

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

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

#!/bin/sh

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

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

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

【问题讨论】:

  • 你的意思是:如何测试一个变量的内容是否在一组值中? 在这里:unix.stackexchange.com/q/111508 ?
  • 是的。假设我希望只有我定义的 5 件事需要作为参数传递,而不是它会说不存在。

标签: arrays if-statement ksh aix


【解决方案1】:

当您想测试更多值时使用开关:

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

【讨论】:

    【解决方案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 是 bashism。

    2. 请注意,您需要在 ksh 中使用 echo -e,正如我在 ksh 93u+ 中确认的 help echo 所说:

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

    【讨论】:

    • 我们不必给空格?
    • @Rishu 。 IIRC 空格在 [[]] 之前和之后是强制性的。
    • 如果 [ "$1"=="A" || "$1"=="B" ]然后; cd /tmp/$1;密码; ls else echo "请传递有效名称" fi ---------------------------------------- ------------------------------------- 我尝试将 AK 作为参数传递并低于 ./test2 .sh AK ./test2.sh[3]: test: 0403-021 A ] 字符丢失。 ./test2.sh[3]:AK==A:未找到。请传递有效名称
    • 如果我提供其他参数并且它也提供其他结果,它会抛出错误。为什么我不仅得到了其他结果?
    • 感谢您的宝贵时间。
    【解决方案3】:

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

    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
    

    这样您可以将所有有效值定义为空格分隔值。该方案可以根据进一步要求进行更改 好处:可以保持列表的外部化,当目录列表发生变化时,无需触碰脚本。

    【讨论】:

    • 看起来很有趣。让我试试看。
    • ./test7.sh[2]:分隔:未找到。 Invalid input 它的说法是分开的:未找到。如果也输入正确的输入。我正在使用 AIX。
    • point#1 不要在 Unix 中创建带有空格的目录(尤其是在 AIX 中) - 例如:unix.stackexchange.com/questions/148043/… point#2 正如我的回答中提到的那样,目的是向 OP 展示如何做,如果他希望目录有空格,他应该更改valid_vals的分隔符
    • @RishuA 我在ksh 中测试了这篇文章,它可以工作。介意发布你的 test7.sh 吗?如果这是 AIX 特定问题,请考虑应用特定标签
    • @ringbearer :这是指导方针,但并不总是遵循。更好的选择是使用一组有效参数。
    【解决方案4】:

    将 if 条件更改为

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

    【讨论】:

    • 谢谢。让我试试看。
    • 如果 [ "$1"=="A" || "$1"=="B" ]然后; cd /tmp/$1;密码; ls else echo "请传递有效名称" fi ---------------------------------------- ------------------------------------- 我尝试将 AK 作为参数传递并低于 ./test2 .sh AK ./test2.sh[3]: test: 0403-021 A ] 字符丢失。 ./test2.sh[3]:AK==A:未找到。请传递有效名称
    • 感谢您的宝贵时间。
    猜你喜欢
    • 2020-08-29
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2011-09-01
    相关资源
    最近更新 更多