2016-08-30 154 views
0

在我的shell脚本中,我正在调用另一个脚本来用于ftping文件。目前如下:Shell:eval和ksh命令之间的区别

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

如果文件名之间有空格,则不起作用。但是,如果我按照如下所述进行更改,则可以使用。

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

那么是什么问题与eval command.I需要文件名与双引号去。如果我没有错,我需要用eval命令来逃避这些空间,那就是我相信的错误。请确认。

+1

在这里使用'eval'有什么意义? –

+0

这是一个现有的旧代码,我现在看到与空格的文件名问题 – Karthik

+3

'eval'看起来对我来说完全没用,但既然你已经在文件名周围使用了单引号和双引号,我看不出为什么它不会工作。 –

回答

1

首先,当然,除了这里发生的事情之外,“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 "$1"; 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" 

外壳你”重新运行该命令以摘掉单引号,但将中包含的字符串提供给这些单引号作为单个参数到您正在运行的命令。 “EVAL”可能被用来做再次

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

...但显然这不是你想要的这里。当ksh获取字符串作为其参数之一时,它将该字符串保持原样,除非将其用于分词或其他内容。

+0

确切地说,这是发生在单引号和双引号都被剥离了因此,我换成了ksh,它现在工作正常,感谢很多简短的解释: ) – Karthik

相关问题