Bash

如何解析 ${!i} (以及它是什麼意思)?

  • April 29, 2020

我遇到${!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 文件站點上找到文件的這一部分。

引用自:https://unix.stackexchange.com/questions/340535