[英]Process all arguments except the first one (in a bash script)
我有一個簡單的腳本,其中第一個參數是為文件名保留的,所有其他可選參數都應該傳遞給腳本的其他部分。
我使用 Google 找到了這個 wiki ,但它提供了一個文字示例:
echo "${@: -1}"
我無法讓其他任何工作,例如:
echo "${@:2}"
要么
echo "${@:2,1}"
我從終端收到“錯誤替代”。
有什么問題,除了傳遞給 bash 腳本的第一個參數之外,我如何處理所有參數?
用這個:
echo "${@:2}"
以下語法:
echo "${*:2}"
也可以工作,但不推薦,因為正如@Gordon已經解釋的那樣,使用*
,它將所有參數作為一個帶空格的單個參數一起運行,而@
保留它們之間的中斷(即使某些參數本身包含空格)。 它與echo
沒有區別,但它對許多其他命令很重要。
如果您想要一個也適用於/bin/sh
的解決方案,請嘗試
first_arg="$1"
shift
echo First argument: "$first_arg"
echo Remaining arguments: "$@"
shift [n]
將位置參數移動n次。 shift
將$1
的值設置為$2
的值,將$2
的值設置為$3
的值,依此類推,將$#
的值$#
一。
在 bash 4 或更高版本中工作:
#!/bin/bash
echo "$0"; #"bash"
bash --version; #"GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)"
在功能上:
echo $@; #"p1" "p2" "p3" "p4" "p5"
echo ${@: 0}; #"bash" "p1" "p2" "p3" "p4" "p5"
echo ${@: 1}; #"p1" "p2" "p3" "p4" "p5"
echo ${@: 2}; #"p2" "p3" "p4" "p5"
echo ${@: 2:1}; #"p2"
echo ${@: 2:2}; #"p2" "p3"
echo ${@: -2}; #"p4" "p5"
echo ${@: -2:1}; #"p4"
注意':'和'-'之間的空格,否則表示不同:
${var:-word}如果 var 為空或未設置,
word 替換為 var。 var 的值不會改變。${var:+word}如果設置了 var,
word 替換為 var。 var 的值不會改變。
http://wiki.bash-hackers.org/scripting/posparams
它解釋了shift
的使用(如果你想丟棄前 N 個參數)然后實現 Mass Usage
遇到這個尋找別的東西。 雖然這篇文章看起來很舊,但 bash 中最簡單的解決方案如下所示(至少是 bash 4),使用set -- "${@:#}"
其中 # 是我們要向前保留的數組元素的起始編號:
#!/bin/bash
someVar="${1}"
someOtherVar="${2}"
set -- "${@:3}"
input=${@}
[[ "${input[*],,}" == *"someword"* ]] && someNewVar="trigger"
echo -e "${someVar}\n${someOtherVar}\n${someNewVar}\n\n${@}"
基本上, set -- "${@:3}"
只是像 perl 的shift一樣彈出數組中的前兩個元素,並保留所有剩余的元素,包括第三個。 我懷疑還有一種方法可以彈出最后一個元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.