2010-08-16 149 views
1

我寫了一個sh腳本(test.sh)是這樣的:爲什麼sh腳本不能工作

#!/bin/sh 

echo [email protected] 

,然後運行它像這樣:

#./test.sh '["hello"]' 

但輸出是:

" 

其實我需要

["hello"] 

bash的版本是:

#bash --version 
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) 

如果我跑

# echo '["hello"]' 
["hello"] 

我不知道爲什麼腳本無法工作...

+1

有趣。在Ubuntu10下的'GNU bash,版本4.1.5(1) - 發行版(i486-pc-linux-gnu)'中可以正常工作。 – paxdiablo 2010-08-16 02:41:33

+0

在mac os x上也能正常工作 – 2010-08-16 02:48:26

+0

它適用於我。嘗試追蹤執行。製作你的第一行'#!/ bin/bash -x',看看這個跟蹤告訴你什麼。 – 2010-08-16 06:33:18

回答

1

你可能的意思是「$ @」,但我認爲它在這種情況下應該沒有多大區別。還值得確保腳本是可執行的(chmod + x test.sh)。

編輯:既然你這麼問,

Bash有串的擴展/操作/不管的各個層面。變量擴展,例如$ @就是其中之一。閱讀man bash瞭解更多信息,但從我所知道的情況來看,Bash將每個命令視爲一個長字符串,直到「分詞」和「引用移除」的最後階段被分解爲參數。

這意味着,根據您的原始定義,./test.sh "a b c d"相當於echo "a" "b" "c" "d",而不是echo "a b c d"。我不確定發生了什麼其他階段的擴張。

整個分詞的事情在UNIX中很常見(和幾乎所有的任何命令行支持的構建系統),您可以在其中定義類似CFLAGS="-Os -std=c99 -Wall"; $ CFLAGS擴展爲「-Os」「-std = c99」「-Wall」是有用的。

在其他「$ scripting」語言(Perl,也可能是PHP)中,$ foo的意思是$ foo。

+0

謝謝,如果我改變$ @爲「$ @」,它的工作原理。但我不知道爲什麼...... – Jianzhong 2010-08-16 02:47:25

+0

雖然我實際上無法重現您的錯誤。 – 2010-08-16 22:05:33

0

只是一個猜測,但也許嘗試將第一行更改爲

#!/bin/bash 

使其實際運行用bash?

+0

不,它仍然不能工作... – Jianzhong 2010-08-16 02:39:18

1

您顯示的手動測試有效,因爲echo獲取參數[「hello」]。最外面的引號被外殼剝離。當你把它放在一個shell腳本中時,每個shell都會去掉一層引號:你輸入的那個和解釋腳本的引號。添加一個額外的引號層可以使其正確工作。

相關問題