2013-12-17 52 views
2

$ values包含一個字符串,我從配置文件grep。這個字符串可以是eiter:?,!或者只是一個包含「foo bar」之類字詞的字符串。Bash Shell:for循環返回不同的值

values="?" 
for value in ${values} 
do 
    echo "value is ${value}" 
done 

如果我執行本地主機上的腳本,結果是:

value is ? 

但是,如果我從遠程主機執行腳本(使用ssh和須藤蘇 - SomeUser的「/ tmp目錄/ foo.sh「),結果是:

value is 2 

到目前爲止,我還沒有找到什麼不同。任何人都可以幫忙嗎?

+0

我猜測這個變量是由於某種原因被擴展的。也許對方的默認外殼不是bash? 'echo $ 0'輸出是什麼? – RedX

+0

參數是否被展開可以取決於目標目錄中是否存在匹配項。我有一個腳本x.sh迴應所有的論點。 ./x.sh?.sh echos'x.sh'while ./x.sh?.sl echos'?.sl',因爲沒有匹配。 – Mzzl

+0

你的遠程機器上有沒有叫'2'的文件?請注意,如果您碰巧擁有一個具有該名稱的文件,則ls?'返回'2';或者 - 通常 - 它返回具有一個字符名稱的文件列表。 – fedorqui

回答

3

您需要引用變量,否則bash會嘗試擴展for-header中的$ values。

values="?" 
for value in "${values}" 
do 
    echo "value is ${value}" 
done 

?本身在bash試圖擴大在當前目錄中的任何單個字符的文件名。例如

$ mkdir somedir 
$ cd somedir 
$ echo ? 
? 
$ mkdir a 
$ echo ? 
a 
$ touch {b..z} 
$ echo ? 
a b c d e f g h i j k l m n o p q r s t u v w x y z 

所以要看你有每個系統上的東西,猜測你在遠程主機上的文件2

+1

另一種選擇是設置'noglob'。 [閱讀更多](http://stackoverflow.com/questions/12225245/set-o-noglob-in-bash-shell-script) – RedX

+0

Noglob的作品。但我不明白爲什麼shell不擴展?在本地啓動腳本時使用字符,但如果我從其他主機啓動腳本,則會擴展它。 – phil

+1

@Phil我很肯定它確實在本地擴展了角色,很可能你在本地計算機的目錄中沒有任何單個字符文件。特殊字符的默認行爲是隻顯示特殊字符。例如,去一個空目錄和'echo *',它會實際打印*。 – BroSlow