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,只是尝试以不同的方式解决问题,因此您不需要将整个条件设为变量。
为什么下面语句的输出为真?
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,只是尝试以不同的方式解决问题,因此您不需要将整个条件设为变量。