2016-08-30 155 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

相關問題