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 获取字符串作为其参数之一时,它会按原样维护该字符串,除非您对其进行分词或其他处理。
在我的 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 获取字符串作为其参数之一时,它会按原样维护该字符串,除非您对其进行分词或其他处理。