J'essaie d'obtenir les paramètres cités d'un script bash pour être reçus en toute sécurité par un script imbriqué. Des idées?
test.sh
#!/bin/bash
echo $*
bash myecho.sh $*
myecho.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
Échantillon:
bash test.sh aaa bbb '"ccc ddd"'
Résultat:
aaa bbb "ccc ddd"
aaa
bbb
"ccc
ddd"
Résultat recherché
aaa bbb "ccc ddd"
aaa
bbb
ccc ddd
Réponses:
Notez que la construction "$ @" n'est pas spécifique à bash et devrait fonctionner avec n'importe quel shell POSIX (elle le fait au moins avec un tiret). Notez également que compte tenu de la sortie souhaitée, vous n'avez pas du tout besoin du niveau supplémentaire de devis. IE appelle simplement le script ci-dessus comme:
la source
$@
n'est pas disponible dans une fonction (car il est écrasé par des arguments de fonction). J'ai essayéfoovar="$@"
etfoovar=$@
+"$foovar"
dans la fonction et aucun n'a fonctionné: - /Vous voulez utiliser "$ @" (dollar cité à) pour passer des paramètres à un indice. Ainsi ....
ls-color.sh:
Quant à savoir pourquoi .....
Depuis la page de manuel Bash :
Configuration de certains scripts de démonstration ...
"$@"
- quoted-dollar-at est une transformation d'identité pour renvoyer des arguments à un sous-shell (~ 99% du temps, c'est ce que vous vouliez faire):"$*"
- quoted-dollar-star écrase les arguments en une seule chaîne (~ 1% du temps où vous voulez réellement ce comportement, par exemple dans un conditionnel:)if [[ -z "$*" ]]; then ...
:$*
/$@
- sans guillemets, les deux formulaires suppriment un niveau de citation et interprètent les espaces des chaînes sous-jacentes mais ignorent les caractères de citation (presque toujours, c'est une erreur):Si vous voulez vous amuser, vous pouvez utiliser "$ @" pour imbriquer les choses aussi profondément que vous le souhaitez, en poussant et en faisant sauter des éléments de la pile d'arguments si vous le souhaitez.
la source