如何解析 ${!i} (以及它是什麼意思)?
我遇到
${!i}
了形式的for循環for ((i=$#; i>0; i--)); do # ... if <SOME_TEST>; then # ... accumulator="${!i}:${accumulator}" # ... fi # ... done
鑑於這個可能值的範圍,我的猜測是這意味著“作為第-th 個位置參數
${!i}
擴展”。i
儘管如此,我想更多地了解這個符號。(特別是 是
${!i}
的特例$@
,還是適用於任何數組的語法的特定實例?這就是為什麼我對錶達式如何解析感到好奇的原因。)不過,我找不到這種表示法的文件。如果我在
bash
手冊頁中搜尋序列${!
,我只找到以下字元串${!name[@]} ${!name[*]} ${!prefix*} ${!prefix@}
…而且我無法將圍繞這些事件的文件與我困惑的程式碼相匹配。
(實際上,如果可能,請在您的答案中引用任何相關文件,以便我可以理清我錯過它的原因。)
編輯:對於我的原始文章,我
for
從原始程式碼中複製了錯誤的行。我現在已經修好了。(不過,解釋是一樣的。)
你的假設是正確的。
更詳細的文件隱藏在
info bash
:3.5.3 Shell參數擴展
$$ … $$ 參數展開的基本形式是
${PARAMETER}
。的值PARAMETER
被替換。這PARAMETER
是一個如上所述的 shell 參數 (*note Shell Parameters::) 或數組引用 (*note Arrays::)。當PARAMETER
是一個多於一位的位置參數時,或者當PARAMETER
後面跟著一個不被解釋為其名稱的一部分的字元時,大括號是必需的。如果 的第一個字元
PARAMETER
是驚嘆號 (!
),並且PARAMETER
不是 NAMEREF,則它引入了變數間接級別。Bash 使用由其餘部分形成的變數的值作為變數PARAMETER
的名稱;然後擴展此變數,並將該值用於替換的其餘部分,而不是其PARAMETER
自身的值。這被稱為“間接擴展”。如果PARAMETER
是一個 nameref,這將擴展為引用的變數的名稱,PARAMETER
而不是執行完整的間接擴展。例外情況是下面的擴展${!PREFIX*}
和${!NAME[@]}
描述。驚嘆號必須緊跟左大括號以引入間接性。為方便起見,您也可以在 GNU.org 文件站點上找到文件的這一部分。