Question Propager tous les arguments dans un script shell bash


J'écris un script très simple qui appelle un autre script, et j'ai besoin de propager les paramètres de mon script actuel vers le script que j'exécute.

Par exemple, mon nom de script est foo.sh et appels bar.sh

foo.sh:

bar $1 $2 $3 $4

Comment puis-je faire cela sans spécifier explicitement chaque paramètre?


569
2018-01-28 03:34


origine


Réponses:


Utilisation "$@" au lieu de plain $@ si vous souhaitez que vos paramètres soient transmis de la même manière.

Observer:

$ cat foo.sh
#!/bin/bash
baz.sh $@

$ cat bar.sh
#!/bin/bash
baz.sh "$@"

$ cat baz.sh
#!/bin/bash
echo Received: $1
echo Received: $2
echo Received: $3
echo Received: $4

$ ./foo.sh first second
Received: first
Received: second
Received:
Received:

$ ./foo.sh "one quoted arg"
Received: one
Received: quoted
Received: arg
Received:

$ ./bar.sh first second
Received: first
Received: second
Received:
Received:

$ ./bar.sh "one quoted arg"
Received: one quoted arg
Received:
Received:
Received:

952
2018-01-28 03:42



Pour frapper et d'autres obus de Bourne:

java com.myserver.Program "$@"

453
2017-07-06 23:00



Utilisation "$@" (travaille pour tous POSIX compatibles).

[...], bash dispose de la variable "$ @", qui s'étend à tous les paramètres de ligne de commande séparés par des espaces.

De Bash par l'exemple.


72
2018-01-28 03:35



#!/usr/bin/env bash
while [ "$1" != "" ]; do
  echo "Received: ${1}" && shift;
done;

Je pense que cela peut être un peu plus utile lorsque vous essayez de tester comment les arguments entrent dans votre script


24
2017-09-04 13:38



Je me rends compte que cela a été bien répondu, mais voici une comparaison entre "$ @" $ @ "$ *" et $ *

Contenu du script de test:

# cat ./test.sh
#!/usr/bin/env bash
echo "================================="

echo "Quoted DOLLAR-AT"
for ARG in "$@"; do
    echo $ARG
done

echo "================================="

echo "NOT Quoted DOLLAR-AT"
for ARG in $@; do
    echo $ARG
done

echo "================================="

echo "Quoted DOLLAR-STAR"
for ARG in "$*"; do
    echo $ARG
done

echo "================================="

echo "NOT Quoted DOLLAR-STAR"
for ARG in $*; do
    echo $ARG
done

echo "================================="

Maintenant, exécutez le script de test avec différents arguments:

# ./test.sh  "arg with space one" "arg2" arg3
=================================
Quoted DOLLAR-AT
arg with space one
arg2
arg3
=================================
NOT Quoted DOLLAR-AT
arg
with
space
one
arg2
arg3
=================================
Quoted DOLLAR-STAR
arg with space one arg2 arg3
=================================
NOT Quoted DOLLAR-STAR
arg
with
space
one
arg2
arg3
=================================

12
2017-09-13 19:36



Mon SUN Unix a beaucoup de limitations, même "$ @" n'a pas été interprété comme désiré. Ma solution de contournement est $ {@}. Par exemple,

#!/bin/ksh
find ./ -type f | xargs grep "${@}"

En passant, je devais avoir ce script particulier car mon Unix ne supporte pas grep -r


5
2017-07-02 13:44



Fonctionne bien, sauf si vous avez des espaces ou des caractères d'échappement. Je ne trouve pas le moyen de capturer des arguments dans ce cas et d'envoyer un SSH à l'intérieur du script.

Cela pourrait être utile mais c'est tellement moche

_command_opts=$( echo "$@" | awk -F\- 'BEGIN { OFS=" -" } { for (i=2;i<=NF;i++) { gsub(/^[a-z] /,"&@",$i) ; gsub(/ $/,"",$i );gsub (/$/,"@",$i) }; print $0 }' | tr '@' \' )

1
2017-07-28 14:46



Si vous incluez $@ Dans une chaîne entre guillemets avec d'autres caractères, le comportement est très étrange lorsqu'il y a plusieurs arguments, seul le premier argument est inclus dans les guillemets.

Exemple:

#!/bin/bash
set -x
bash -c "true foo $@"

Rendements:

$ bash test.sh bar baz
+ bash -c 'true foo bar' baz

Mais en assignant à une variable différente d'abord:

#!/bin/bash
set -x
args="$@"
bash -c "true foo $args"

Rendements:

$ bash test.sh bar baz
+ args='bar baz'
+ bash -c 'true foo bar baz'

0
2018-06-05 17:30