2017-03-13 16 views
1

腳本:

#!/bin/bash  
declare -a arr=() 
echo ${#arr[@]:-} 

失敗上的Arch Linux(bash的4.4.5):

-bash: ${#arr[@]:-}: bad substitution 

雖然它工作在Ubuntu 14.04(bash的4.3.11)或Debian的8(30年4月3日) 。

+3

這個替換......實際上並沒有使*感*。你爲什麼期望它可以工作? (而且要清楚 - 如果某些事情沒有記錄起來,那麼它在將來停止工作不是一個錯誤,而只是未定義行爲的改變。 –

+0

(數組長度不能爲空或空,因此「默認爲空」是沒有意義的)。 –

+0

另一件事是,bash的git存儲庫實際上並沒有變更級別的粒度 - 每次他發佈新版本時,Chet都會做一次新的提交,所以沒有足夠的信息來平分「更改X ,用提交消息Y對錯誤Z做出響應,導致此行爲增量「。 –

回答

5

arrayfunc.cvalid_array_reference功能中,添加了以下檢查:

if (t[len+1] != '\0') 
    return 0; 

因此,膨脹現在驗證在預期的點來結束,而以前,下標以下無效/意外的內容被忽略。


這在CWRU /更改日誌條目被記錄爲6/5如下:

arrayfunc.c

  • valid_array_reference:確保數組引用是正確 第一個之後,終止標;返回無效的,如果有什麼 收盤]

值得注意的是,valid_array_referencesubst.cvalid_length_expression稱爲繼 - 這被稱爲爲先導,以parameter_brace_expand_length,其實際執行手頭的替代。

相關問題