为什么需要为 $ 添加转义字符?在评估中?
Why need to add escape character for $? in eval?
我有下一个:
$ export A=1
$ eval "echo $A; echo $A; lll; echo $?"
输出为:
1
1
-bash: lll: command not found
0
不知道为什么获取不到lll
的退出码,正好接下来试试:
$ export A=1
$ eval "echo $A; echo $A; lll; echo $?"
1
1
-bash: lll: command not found
127
您可以看到上面的作品,同时还有下一个作品:
$ export A=1
$ eval "echo $A; echo $A; lll; echo $?"
1
1
-bash: lll: command not found
127
我想知道,为什么我必须在$?
之前添加一个\
?另外,为什么 $A
之前的 \
不是必须的?
请记住,因为您已经将要评估的整个表达式括在双引号中。这意味着在调用 eval
之前,其中的所有参数都将被展开。如果不转义$?
,展开的参数是A
和?
。您在 eval
之前获得 A
的值是 运行(这是您想要的),但您也会在 ?
before eval
是 运行 (这不是你想要的)。反斜杠导致将文字 $
传递给 eval
,从而推迟计算状态代码的时间。
$ eval "echo $A; echo $A; lll; echo $?"
双引号括起来的变量被展开。上面这行是一样的:
$ eval "echo 1; echo 1; lll; echo 0"
事实上,这个字符串正是 eval
接收的参数。您甚至不需要为此 export A
。
为了实现您想要的效果,应该将字符串括在单引号中。这样,变量就不会再扩展了,eval
接收与您输入的字符串完全相同的字符串作为参数。
试试这两组命令
$ export A=1
$ B="echo $A; echo $A; lll; echo $?"
$ eval $B
$ A=2
$ eval $B
对比
$ export A=1
$ B='echo $A; echo $A; lll; echo $?'
$ eval $B
$ A=2
$ eval $B
这是不同的,不是吗?
我有下一个:
$ export A=1
$ eval "echo $A; echo $A; lll; echo $?"
输出为:
1
1
-bash: lll: command not found
0
不知道为什么获取不到lll
的退出码,正好接下来试试:
$ export A=1
$ eval "echo $A; echo $A; lll; echo $?"
1
1
-bash: lll: command not found
127
您可以看到上面的作品,同时还有下一个作品:
$ export A=1
$ eval "echo $A; echo $A; lll; echo $?"
1
1
-bash: lll: command not found
127
我想知道,为什么我必须在$?
之前添加一个\
?另外,为什么 $A
之前的 \
不是必须的?
请记住,因为您已经将要评估的整个表达式括在双引号中。这意味着在调用 eval
之前,其中的所有参数都将被展开。如果不转义$?
,展开的参数是A
和?
。您在 eval
之前获得 A
的值是 运行(这是您想要的),但您也会在 ?
before eval
是 运行 (这不是你想要的)。反斜杠导致将文字 $
传递给 eval
,从而推迟计算状态代码的时间。
$ eval "echo $A; echo $A; lll; echo $?"
双引号括起来的变量被展开。上面这行是一样的:
$ eval "echo 1; echo 1; lll; echo 0"
事实上,这个字符串正是 eval
接收的参数。您甚至不需要为此 export A
。
为了实现您想要的效果,应该将字符串括在单引号中。这样,变量就不会再扩展了,eval
接收与您输入的字符串完全相同的字符串作为参数。
试试这两组命令
$ export A=1
$ B="echo $A; echo $A; lll; echo $?"
$ eval $B
$ A=2
$ eval $B
对比
$ export A=1
$ B='echo $A; echo $A; lll; echo $?'
$ eval $B
$ A=2
$ eval $B
这是不同的,不是吗?