2013-12-11 89 views
3

我在尋找一個目錄中的子目錄的數量,並將其與預定義的數字進行比較。bash中的簡單字符串比較

例:

cd /Applications/ 
x=echo ls -d */ | wc -l | sed 's/^ *//g' 
y="52" 

if [ "$x" == "$y" ]; then 
    echo "equal" 
else 
    echo "not equal" 
fi 

它會給我(對我來說52)對於x一個數字,但總是會說 「不等於」。我究竟做錯了什麼?任何幫助將不勝感激。

感謝

+0

其實,它不會給你一個數字。 – user2719058

+0

考慮使用[[]] - 雙方括號形式的謂詞,除非您需要與不具有此擴展名的shell兼容,基於以下原因:http://stackoverflow.com/questions/13542832/ bash-if-difference-between-square-brackets-and-double-square-brackets – polkadotcadaver

+0

我知道這不會給我一個數字本身,但我比較兩個字符串;除非我失去了一些東西?我不幸的嘗試了雙方括號。 – user3089044

回答

0

更換

x=echo ls -d */ | wc -l | sed 's/^ *//g' 

有:

x="$(ls -d */ | wc -l | sed 's/^ *//g')" 

說明:當你寫x=echo ls -d */ ...時,bash認爲你的意思是臨時設置的變量x的值的「回聲」,然後運行ls命令。相反,您需要運行命令s -d */ | wc -l | sed 's/^ *//g'並將輸出保存在x中。構造x=$(...)告訴bash執行任何在parens中的內容,並將輸出分配給x

另外, bash的[命令不接受==。使用=進行字符串比較。但是,你真的想要數學比較。因此,使用 '當量':

if [ "$x" -eq "$y" ]; then 
+0

感謝您的快速回復。我注意到它不再打印x的值,但它仍然沒有正確評估我的比較。 52 == 52顯示不相等。除非我仍然失去一些東西? – user3089044

+0

查看更新的答案。 – John1024

+0

我最初是以'eq'開頭,然後'=',但兩者並不相等。再次感謝。 – user3089044

3

對於bash,這樣做:

cd /Applications/ 
dirs=(*/) # dirs is an array with the names of directories here 
if ((${#dirs[@]} == $y)); then 
    echo "equal" 
else 
    echo "not equal" 
fi