首先,當然,除了這裏發生的事情之外,「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獲取字符串作爲其參數之一時,它將該字符串保持原樣,除非將其用於分詞或其他內容。
在這裏使用'eval'有什麼意義? –
這是一個現有的舊代碼,我現在看到與空格的文件名問題 – Karthik
'eval'看起來對我來說完全沒用,但既然你已經在文件名周圍使用了單引號和雙引號,我看不出爲什麼它不會工作。 –