Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
Linux 像语句条件一样求值_Linux_Bash_If Statement_Eval - Fatal编程技术网

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
会产生成功?正如你所说,缺少空格,但为什么结果成功?语法错误会被评估为失败…告诉人们该怎么做是可以的,但是最好解释一下原因,这样可以避免他们(或其他人)重复错误。