web-dev-qa-db-fra.com

Convertir les arguments de ligne de commande en un tableau dans Bash

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
134
Suman

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.

173
kojiro

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
50
Nahuel Fouilleul

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
16
user2350426

Voici un autre usage:

#!/bin/bash
array=( "$@" )
arraylength=${#array[@]}
for (( i=1; i<${arraylength}+1; i++ ));
do
   echo "${array[$i-1]}"
done
5
tuğrul altun

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
4
runlevel0

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
1
Kirin

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.
> 
0
Jacob Wegelin