Shell: eval 和 ksh 命令的区别

Shell: Difference between eval and ksh commands

在我的 shell 脚本中,我正在调用另一个用于 ftping 文件的脚本。目前如下:

eval doftp.sh -1 '"File Name with spaces.txt"'

如果文件名之间有空格则不起作用。但是,如果我进行如下更改,它就会起作用。

ksh doftp.sh -1 '"File Name with spaces.txt"'

那么 eval 有什么问题 command.I 需要文件名用双引号引起来。如果我没记错的话,我需要使用 eval 命令转义空格,我相信这就是我出错的地方。请确认。

首先,当然,"eval" 除了这里发生的事情之外,还可以做各种事情。它指示 shell 重新评估其参数。例如,您可以这样做:

b=4
a='b'
eval "$a=3"
echo $b    # yields 3

这也意味着 "eval" 本质上有点危险,因为它会 运行 给出任何命令。

a='rm -rf /;b'
eval "$a=3"    #Removes all your files and sets b=3

在这种情况下,"eval" 似乎只是去掉了一些引号。

eval doftp.sh -1 '"File Name with spaces.txt"'
# is equivalent to:
doftp.sh -1 "File Name with spaces.txt"

运行 以 shell 脚本作为其参数的 shell 等同于仅 运行 宁 shell 脚本。它不会重新处理参数 - 这意味着 shell 脚本中的某些内容可能需要这些引号。 (鉴于它被称为 "doftp",也许它在 FTP 客户端中将引用的字符串作为参数提供给 "get" 或 "put"。)

如果你有一个 shell 脚本 "args.sh" 打印你给它的参数,例如:

# args.sh
while [ "$#" -gt 0 ]; do echo ""; shift; done

而你 运行 就像你 运行宁 "doftp.sh",这就是你会看到的:

$ ./args.sh unquoted '"String with     spaces"'
unquoted
"String with     spaces"
$ ksh ./args.sh unquoted '"String with     spaces"'
unquoted
"String with     spaces"

shell 您正在 运行 中删除单引号的命令,但将 包含在 中的字符串提供给这些单引号 作为您正在 运行 的命令的单个参数。 "eval" 可用于再次 :

$ eval ./args.sh unquoted '"String with     spaces"'
unquoted
String with     spaces

...但显然这不是您想要的。当 ksh 获取字符串作为其参数之一时,它会按原样维护该字符串,除非您对其进行分词或其他处理。