Comment convertir des arguments de ligne de commande dans un tableau de scripts bash?
Je veux prendre ceci:
./something.sh arg1 arg2 arg3
et le convertir en
myArray=( arg1 arg2 arg3 )
afin que je puisse utiliser myArray pour une utilisation ultérieure dans le script.
Cette précédente SO publication se rapproche, mais n'entre pas dans la création d'un tableau: Comment analyser les arguments de ligne de commande dans Bash?
J'ai besoin de convertir les arguments en un tableau de script bash standard; Je me rends compte que je pourrais utiliser d'autres langages (Python, par exemple), mais que je dois le faire en bash. Je suppose que je recherche une fonction "append" ou quelque chose de similaire?
UPDATE: Je voulais aussi demander comment vérifier si zéro argument et assigner une valeur de tableau par défaut, et grâce à la réponse ci-dessous, j'ai pu obtenir que cela fonctionne:
if [ "$#" -eq 0 ]; then
myArray=( defaultarg1 defaultarg2 )
else
myArray=( "$@" )
fi
En fait, vos arguments en ligne de commande sont pratiquement déjà comme un tableau. Au moins, vous pouvez traiter la variable $@
un peu comme un tableau. Cela dit, vous pouvez le convertir en un tableau réel comme ceci:
myArray=( "$@" )
Si vous voulez juste taper quelques arguments et les introduire dans la valeur $@
, utilisez set
:
$ set -- Apple banana "kiwi fruit"
$ echo "$#"
3
$ echo "$@"
Apple banana kiwi fruit
Comprendre comment utiliser la structure d'argument est particulièrement utile dans POSIX sh, qui n'a rien d'autre qu'un tableau.
Peut-être que cela peut aider:
myArray=("$@")
vous pouvez aussi parcourir des arguments en omettant 'in':
for arg; do
echo "$arg"
done
sera équivalent
for arg in "${myArray[@]}"; do
echo "$arg"
done
En fait, la liste des paramètres est accessible avec $1 $2 ...
etc.
Ce qui correspond exactement à:
${!i}
Ainsi, la liste des paramètres peut être modifiée avec set,
et ${!i}
est le moyen correct d’y accéder:
$ set -- aa bb cc dd 55 ff gg hh ii jjj kkk lll
$ for ((i=0;i<=$#;i++)); do echo "$#" "$i" "${!i}"; done
12 1 aa
12 2 bb
12 3 cc
12 4 dd
12 5 55
12 6 ff
12 7 gg
12 8 hh
12 9 ii
12 10 jjj
12 11 kkk
12 12 lll
Dans votre cas, cela pourrait être utilisé (sans avoir besoin de tableaux), pour définir la liste des arguments quand aucun n'a été donné:
if [ "$#" -eq 0 ]; then
set -- defaultarg1 defaultarg2
fi
ce qui se traduit par cette expression encore plus simple:
[ "$#" == "0" ] && set -- defaultarg1 defaultarg2
Voici un autre usage:
#!/bin/bash
array=( "$@" )
arraylength=${#array[@]}
for (( i=1; i<${arraylength}+1; i++ ));
do
echo "${array[$i-1]}"
done
Plus facile encore, vous pouvez opérer directement sur $@
;)
Voici comment faire passer une liste d'arguments directement à partir de l'invite:
function echoarg { for stuff in "$@" ; do echo $stuff ; done ; }
echoarg Hey Ho Lets Go
Hey
Ho
Lets
Go
Vue côte à côte de la façon dont le tableau et $ @ sont pratiquement les mêmes.
Code:
#!/bin/bash
echo "Dollar-1 : $1"
echo "Dollar-2 : $2"
echo "Dollar-3 : $3"
echo "Dollar-AT: $@"
echo ""
myArray=( "$@" )
echo "A Val 0: ${myArray[0]}"
echo "A Val 1: ${myArray[1]}"
echo "A Val 2: ${myArray[2]}"
echo "A All Values: ${myArray[@]}"
Contribution:
./bash-array-practice.sh 1 2 3 4
Sortie:
Dollar-1 : 1
Dollar-2 : 2
Dollar-3 : 3
Dollar-AT: 1 2 3 4
A Val 0: 1
A Val 1: 2
A Val 2: 3
A All Values: 1 2 3 4
Il convient de souligner l’importance des guillemets doubles. Supposons qu'un argument contienne des espaces.
Code:
#!/bin/bash
printf 'arguments:%s\n' "$@"
declare -a arrayGOOD=( "$@" )
declare -a arrayBAAD=( $@ )
printf '\n%s:\n' arrayGOOD
declare -p arrayGOOD
arrayGOODlength=${#arrayGOOD[@]}
for (( i=1; i<${arrayGOODlength}+1; i++ ));
do
echo "${arrayGOOD[$i-1]}"
done
printf '\n%s:\n' arrayBAAD
declare -p arrayBAAD
arrayBAADlength=${#arrayBAAD[@]}
for (( i=1; i<${arrayBAADlength}+1; i++ ));
do
echo "${arrayBAAD[$i-1]}"
done
Sortie:
> ./bash-array-practice.sh 'The dog ate the "flea" -- and ' the mouse.
arguments:The dog ate the "flea" -- and
arguments:the
arguments:mouse.
arrayGOOD:
declare -a arrayGOOD='([0]="The dog ate the \"flea\" -- and " [1]="the" [2]="mouse.")'
The dog ate the "flea" -- and
the
mouse.
arrayBAAD:
declare -a arrayBAAD='([0]="The" [1]="dog" [2]="ate" [3]="the" [4]="\"flea\"" [5]="--" [6]="and" [7]="the" [8]="mouse.")'
The
dog
ate
the
"flea"
--
and
the
mouse.
>