2012-10-27 76 views
5

我想檢查bash數組的長度是否等於bash變量(int)。我目前的代碼如下所示:檢查數組的長度是否等於bash中的變量

if [ "${#selected_columns}" -eq "${number_of_columns}" ]; then 
    echo "They are equal!" 
fi 

由於echo語句永遠不會運行,所以返回false。但是,這樣做會對它們產生4:

echo "${#selected_columns[@]}" 
echo "${number_of_columns}" 

這裏有什麼問題?它與字符串與int有關嗎?

+5

在第一個例子中,你是不是缺少'[@]'? – Junuxx

+0

'if [「$ {#selected_columns [@]}」-eq「$ {number_of_columns}」];然後' –

+0

是的,只是一個愚蠢的錯字。謝謝! –

回答

5

在你:

if [ "${#selected_columns}" -eq "${number_of_columns}" ]; then 
    echo "They are equal!" 
fi 

${#selected_columns}缺少[@]

修正:

if [ "${#selected_columns[@]}" -eq "${number_of_columns}" ]; then 
    echo "They are equal!" 
fi 
+0

除了你爲什麼不回答一個答案?除了最初的提問者之外,StackOverflow是關於回答其他人的利益的問題。有人可能不會閱讀某個問題下的評論,只是在看到尚未提交答案後才離開而不學習任何新內容。 (我錯過了你的評論,直到我中途輸入解決方案)將你的評論移到一個答案,如果你願意,我會鼓勵你。 –

+0

我認爲你對這個問題有強烈的感受:爲什麼不發表你的評論作爲答案,我會刪除自己的答案,如果這讓你開心? =) –

+0

不,你已經做了骯髒的工作。現在很容易看出什麼是錯的;) –

2

據bash的手冊頁:

$ {#名[下標]}擴展到$ {長名[下標]}。如果下標是*或@,則展開是數組中元素的數量。引用數組變量沒有下標等效於參考所述陣列的0

標上索引數組使用${name}將導致到${name[0]},則得到的${name[0]}長度,不計算整個數組的元素。所以這不是將字符串與整數進行比較的問題。 AFAIK,比較「字符串中的整數」和「由let分配的整數」在bash腳本中從來不是問題。

相關問題