簡體   English   中英

處理除第一個參數以外的所有參數(在 bash 腳本中)

[英]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 的值不會改變。

描述於: Unix / Linux - Shell Substitution

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM