Linux 像语句条件一样求值
为什么以下语句的输出为真Linux 像语句条件一样求值,linux,bash,if-statement,eval,Linux,Bash,If Statement,Eval,为什么以下语句的输出为真 VAR="[[ "x"=="y" ]]" if eval $VAR ; then echo "true" else echo "false" fi 在bash中,是否有其他方法使用变量作为if语句的条件?您的引用是一个问题,需要在==周围留出空格: VAR='[[ "x" == "y" ]]' if eval $VAR ; then echo "true" else echo "false" fi 但是,您必须尽可能避免使用eval。
VAR="[[ "x"=="y" ]]"
if eval $VAR ; then
echo "true"
else
echo "false"
fi
在bash中,是否有其他方法使用变量作为if语句的条件?您的引用是一个问题,需要在
==
周围留出空格:
VAR='[[ "x" == "y" ]]'
if eval $VAR ; then
echo "true"
else
echo "false"
fi
但是,您必须尽可能避免使用eval
。您可以在此处使用函数:
fvar() { [[ "x" == "y" ]]; }
然后称之为:
if fvar; then
echo "true"
else
echo "false"
fi
原因为什么您的
eval
条件计算为true
,因为您有VAR=“[[[“x”==“y”]]”
,其中[[
和]]
中的文本被视为单个字符串。这与评估[[a]]
或[[foo]]
相同,我的第一次回答尝试被否决,因此我将尝试澄清,希望它至少回到0,并在考虑其他答案时添加一些有价值的内容。我承认我有点不清楚你在问什么
首先,你的x和y应该是文字还是变量?我不确定的部分原因是作业中的额外引用。注:这些是等效的:
$ VAR="[[ "x"=="y" ]]"
$ echo $VAR
[[ x==y ]]
$ VAR="[[ x==y ]]"
$ echo $VAR
[[ x==y ]]
所以在这种情况下
if eval $VAR ; then
就是说
if [[ x==y ]]
当eval遇到问题时,您需要像这样打印变量的值,以查看执行的是什么
x==y是一个参数,单个字符串参数上的[[运算符]会说,“这是长度非零的字符串吗?”例如:
$ if [[ dkfjek ]]; then echo true; else echo false; fi
true
$ if [[ any_non_zero_length_string ]]; then echo true; else echo false; fi
true
$ if [[ "" ]]; then echo true; else echo false; fi
false
要使用==您需要空白。例如,不带eval和带eval:
$ if [[ x == x ]]; then echo true; else echo false; fi
true
$ if [[ x == y ]]; then echo true; else echo false; fi
false
$ VAR="[[ x == x ]]"; if eval $VAR; then echo true; else echo false; fi
true
$ VAR="[[ x == y ]]"; if eval $VAR; then echo true; else echo false; fi
false
通常,尽管你真的想避免EVE,除非你已经真正确定了变量的值是什么。考虑一个代码段,在这里你让用户决定测试的条件:你可以在脚本中写类似的东西:
read -p "type condition> " COND;
VAR="[[ $COND ]]";
if eval $VAR;
then
echo true;
else
echo false;
fi
您运行它时可能需要输入/输出,如:
type condition> x == x
true
但是如果有人进入这个怎么办
type condition> x == x ]]; touch /tmp/oh-no; [[ true
true
什么是$VAR?什么是/tmp/oh no
$ echo $VAR
[[ x == x ]]; touch /tmp/oh-no; [[ true ]]
$ ls -l /tmp/oh-no
-rw-r--r-- 1 splante isiusers 0 Nov 3 15:17 /tmp/oh-no
记住语法是“if”。“[[”只是一个可能的命令,但是任何复合命令都可以在if之后执行。现在假设用户输入了其他更具破坏性的命令,而不是touch/tmp/oh no
,它也会执行
您询问“是否有其他方法可以在bash中使用变量作为if语句的条件?”这是比较bash中两个变量的字符串等价性的典型方法:
if [[ "$x" = "$y" ]]; then ...
我想现在你已经知道了这一点,但我几乎从不使用eval,只是尝试以不同的方式解决问题,这样你就不需要把整个条件都变成一个变量。大概,真正的逻辑要比
“x”==“y”
复杂一点,因为它可以计算为false,从而简化很多代码(它变为回显“false”
).但是你是对的,eval
应该尽可能避免。如果它回答了这个问题,这将是一个更好的答案。为什么字符串的eval
会产生成功?正如你所说,缺少空格,但为什么结果成功?语法错误会被评估为失败…告诉人们该怎么做是可以的,但是最好解释一下原因,这样可以避免他们(或其他人)重复错误。