Bash

當 n 直到執行時才知道時,如何列印腳本的第 n 個參數?

  • March 11, 2022

我正在編寫一個 shell 腳本,我需要列印腳本的第 n 個參數。

例如,假設我們有n=3並且我們的腳本以足夠的參數執行。現在我需要列印第nth 個參數,即$3.

但是如果n=2,我們會列印參數$2

我不想使用if語句。我想做類似的事情

echo $($n)

但是上面的方法並不能按照我需要的方式工作。

按時間順序,在各種外殼中:

  • csh(70 年代末):($argv[$n]自 1991 年起在 zsh 中工作,自 2005 年起在 fish 中工作)
  • zsh (1991): $argv[n]// $@[n]$*[n]最後一個也被 yash 支持,但只有額外的大括號:${@[n]}/ ${*[n]}
  • rc(90 年代初):$$n/ $*($n)(也適用於 es、akanga)
  • ksh93 (1993): ${@:n:1}, (自 1996 年以來也受 bash 支持;自 2010 年${*:n:1}以來 zsh 也支持,儘管您需要或在那裡避免與 csh 樣式修飾符發生衝突並查看案例)${@:$n:1}``${@: n:1}``"$*"
  • 重擊(1996):${!n}
  • zsh ( 1999 ) ${(P)n}:.

請記住,在 ksh93/bash/yash 中,您至少需要在列表上下文中引用參數擴展,而 csh 幾乎不能用於編寫可靠的程式碼。

在中,當未設置第n個位置參數時,列表上下文和列表上下文bash之間存在差異,因為後者然後擴展為沒有參數,而前者擴展為一個空元素。"${!n}"``"${@:n:1}"

在類似 Bourne 的 shell 中(但不是 Bourne shell,因為它不適用於 9 號之後的索引),並且使用標準 POSIX sh 語法,您還可以執行以下操作:

eval "nth=\${$n}"

$n如果不包含嚴格大於 0 的整數的規範十進製表示,那麼所有這些之間的行為也會有所不同。如果您不能保證會是這種情況,則使用其中的大多數(不僅僅是eval一個)會引入了一個任意命令執行漏洞(唯一的例外rc可能是csh上面的)。

還要記住,除了zsh(with echo -E - $argv[n])、yash(with ECHO_STYLE=raw echo "${*[$n]}") 和fish(with echo -- $argv[$n]) 之外,echo不能用於輸出任意數據,請printf '%s\n' ...改用)。

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