Bash
當 n 直到執行時才知道時,如何列印腳本的第 n 個參數?
我正在編寫一個 shell 腳本,我需要列印腳本的第 n 個參數。
例如,假設我們有
n=3
並且我們的腳本以足夠的參數執行。現在我需要列印第n
th 個參數,即$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
(withecho -E - $argv[n]
)、yash
(withECHO_STYLE=raw echo "${*[$n]}"
) 和fish
(withecho -- $argv[$n]
) 之外,echo
不能用於輸出任意數據,請printf '%s\n' ...
改用)。