Comment gérer plus de 10 paramètres dans le shell


101

J'utilise bash shell sur Linux et je souhaite utiliser plus de 10 paramètres dans le script shell


8
Notez que le fait d'avoir 10 paramètres rendra les choses assez déroutantes. Il vaudrait peut-être mieux utiliser des options (par exemple -a 1ou --foo=bar) à la place. Voir man getopt, man getoptset man bashpour quelques options pour le faire.
Mikel

Réponses:


158

Utilisez des accolades pour les mettre en valeur:

echo "${10}"

Vous pouvez également parcourir les paramètres de position comme ceci:

for arg

ou

for arg in "$@"

ou

while (( $# > 0 ))    # or [ $# -gt 0 ]
do
    echo "$1"
    shift
done

2
Notez que $ {10} fonctionnera dans bash, mais limitera votre portabilité car de nombreuses implémentations de sh n'autorisent que des spécifications à un chiffre.
William Pursell

1
@William: Il y a des shells qui ne l'acceptent pas, comme le shell Bourne hérité d'origine, mais en plus des shells que j'ai listés dans un autre commentaire (Bash, dash, ksh et zsh), cela fonctionne aussi dans csh, tcsh et Busybox ash.
Suspendu jusqu'à nouvel ordre.

1
@WilliamPursell ${10}est défini par POSIX
Steven Penny

2
Se soucier du ${10}travail n'est nécessaire que lors de l'utilisation de très anciennes implémentations non conformes aux standards. Probablement d'intérêt historique ... et pourtant je ne l'ai jamais utilisé! Je suppose que parce que les meilleures pratiques dictent que 10 arguments sont bien trop nombreux à moins qu'ils ne soient répétés, auquel cas vous allez les parcourir "$@"plutôt que de les énumérer.
William Pursell

22

Vous pouvez avoir jusqu'à 256 paramètres de 0 à 255 avec:

${255}

5
Je pense que cette limite dépend de la coque. Bash, dash, ksh et zsh ne semblent pas l'avoir. sh -c 'echo ${333}' /usr/bin/*
Suspendu jusqu'à nouvel ordre.

3
Ma coquille monte confortablement à 2 millionsset $(seq 2097152); echo ${2097152}
Steven Penny
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.