676 Stimmen

Alle Argumente außer dem ersten verarbeiten (in einem Bash-Skript)

Ich habe ein einfaches Skript, bei dem das erste Argument für den Dateinamen reserviert ist und alle anderen optionalen Argumente an andere Teile des Skripts übergeben werden sollen.

Mit Google fand ich dieses Wiki aber sie lieferte ein wörtliches Beispiel:

echo "${@: -1}"

Ich kann nichts anderes zum Laufen bringen:

echo "${@:2,1}"

Ich erhalte "Bad substitution" vom Terminal.

Was ist das Problem, und wie kann ich alle außer dem ersten Argument an ein Bash-Skript übergeben verarbeiten?

972voto

Oliver Charlesworth Punkte 259497

Verwenden Sie dies:

echo "${@:2}"

Die folgende Syntax:

echo "${*:2}"

würde ebenfalls funktionieren, wird aber nicht empfohlen, da @Gordon bereits erläutert, dass die Verwendung von * werden alle Argumente zusammen als ein einziges Argument mit Leerzeichen ausgeführt, während @ behält die Umbrüche zwischen ihnen bei (auch wenn einige der Argumente selbst Leerzeichen enthalten). Es macht keinen Unterschied mit echo aber für viele andere Befehle ist es wichtig.

253voto

Ben Jackson Punkte 84305

Wenn Sie eine Lösung wünschen, die auch in /bin/sh Versuchen Sie

first_arg="$1"
shift
echo First argument: "$first_arg"
echo Remaining arguments: "$@"

shift [n] verschiebt die Positionsparameter n Zeiten. A shift setzt den Wert von $1 auf den Wert von $2 der Wert von $2 auf den Wert von $3 und so weiter, wodurch sich der Wert von $# von einem.

77voto

walknotes Punkte 620

Arbeiten in bash 4 oder höherer Version:

#!/bin/bash
echo "$0";         #"bash"
bash --version;    #"GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)"

In Funktion:

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"

Beachten Sie das Leerzeichen zwischen ':' und '-', sonst bedeutet es etwas anderes:

${var:-word} Wenn var null oder nicht gesetzt ist,
Der Wert von var ändert sich nicht.

${var:+wort} Wenn var gesetzt ist,
Der Wert von var ändert sich nicht.

Das ist beschrieben in: Unix / Linux - Shell-Ersatz

4voto

OnlineCop Punkte 3909

http://wiki.bash-hackers.org/scripting/posparams

Er erklärt die Verwendung von shift (wenn Sie die ersten N Parameter verwerfen wollen) und dann Durchführung der Massenverwendung

3voto

Pavman Punkte 109

Ich bin auf der Suche nach etwas anderem auf diese Seite gestoßen. Während der Beitrag sieht ziemlich alt, die einfachste Lösung in Bash ist unten (zumindest Bash 4) mit set -- "${@:#}" wobei # die Anfangsnummer des Array-Elements ist, das wir weiterführen wollen:

    #!/bin/bash

    someVar="${1}"
    someOtherVar="${2}"
    set -- "${@:3}"
    input=${@}

    [[ "${input[*],,}" == *"someword"* ]] && someNewVar="trigger"

    echo -e "${someVar}\n${someOtherVar}\n${someNewVar}\n\n${@}"

Grundsätzlich gilt, dass die set -- "${@:3}" einfach die ersten beiden Elemente des Arrays ab, wie bei Perl Schicht und alle übrigen Elemente, einschließlich des dritten, bleiben erhalten. Ich vermute, dass es eine Möglichkeit gibt, auch die letzten Elemente zu entfernen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X