2012-04-16 112 views
0

這是一個簡單的腳本,從實際有用的東西中提煉出來的,適用於Fedora,但不適用於OS X Lion。bash腳本與Linux上的陣列作品不在mac os x

declare -a directory_contents=($(ls .)) 
test -e ${directory_contents[0]} 
echo $? 

在linux上它返回0,即測試-e通過。在Mac上,它返回1.

任何想法在這裏可能會出錯?

+0

上面的代碼在我的OS X 10.6.8上返回0 ... – miku 2012-04-16 21:45:56

+0

@NickAtoms,[yes](https://gist.github.com/2401956)。這是很好的老bash 3.2.48(1) - 釋放。 – miku 2012-04-16 22:00:43

+0

蘋果仍然分發bash 3.2,而不是bash 4.x.這是你麻煩的根源嗎? – 2012-04-16 22:01:57

回答

0

我在原始問題中忽略的一點是,我的「腳本」確實是一個bash函數。我的問題的原因是「ls」正在解析爲具有「--color = auto」的別名,將不可打印的字符添加到實際的文件名。

總是定義變量來保存腳本中使用的可執行文件的完整路徑,例如「LS =/bin/ls」。而且,根據上面的答案,ls可能不是您強健的製作腳本的最佳選擇。

2

尼克的答案是正確的。但是你也應該記住,除非在高度控制的環境中,ls而不是你應該用來填充帶有文件名的變量。有很多其他的方法可以選擇一個文件名。

[[email protected] ~]$ ls -l foo* 
-rw-r--r-- 1 ghoti wheel 0 Apr 16 21:01 foo bar.txt 
-rw-r--r-- 1 ghoti wheel 0 Apr 16 21:01 foo.txt 
[[email protected] ~]$ test1=`for i in foo*txt;do echo $i; break; done` 
[[email protected] ~]$ echo $test1 
foo bar.txt 
[[email protected] ~]$ test2=`find . -name foo\*.txt -print | head -1` 
[[email protected] ~]$ echo $test2 
./foo.txt 
[[email protected] ~]$ 

顯然,並不是所有的方法都會以相同的順序返回文件。

還要注意以連字符開頭的文件名。 :-)

+0

Upvote,因爲你的答案直指問題的核心,即不要依賴「ls」。雖然這不是真正的原因。我回答了我自己的問題,儘管現在看起來很明顯,所以希望可以幫助其他人。 – pduey 2012-04-17 14:52:27