eval as if 语句条件

eval as if statement condition

为什么下面语句的输出为真?

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 是一个参数,单个字符串参数上的 [[ 运算符表示,"is this a non-zero length string?" 例如:

$ 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:

$ 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

通常你真的想避免 eval 除非你真的确定了变量的值是多少。考虑一个代码片段,您让用户决定要测试的条件:您可以在脚本中编写如下内容:

read -p "type condition> " COND; 
VAR="[[ $COND ]]"; 
if eval $VAR; 
then 
  echo true; 
else 
  echo false;
fi

您可能 运行 它期望 input/output 像:

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 <command>"。 "[[" 只是一种可能的命令,但任何复合命令都可以在 if 之后执行。现在假设用户输入了一些其他更具破坏性的命令而不是 touch /tmp/oh-no?它也会被执行。

您问 "Is there any other way to use a variable as condition for an if statement in bash?" 这是在 bash 中比较两个变量的字符串等价性的典型方法:

if [[ "$x" = "$y" ]]; then ...

我假设您现在已经知道这一点,但我几乎从不使用 eval,只是尝试以不同的方式解决问题,因此您不需要将整个条件设为变量。