2009-11-28 6 views
3

J'utilise le code dans/bin/sh comme ceci:Comment puis-je utiliser des tableaux dans un shell Unix?

LIST1="mazda toyota honda" 
LIST2="2009 2006 2010" 

for m in $LIST1 
do 
echo $m 
done 

Comme vous pouvez le voir imprime actuellement uniquement la marque de la voiture. Comment puis-je inclure l'année à chaque "echo" sur la base des mêmes positions pour que j'obtenir des résultats comme:

mazda 2009

toyota 2006

honda 2010

?

+2

Lorsque vous avez besoin de tableaux dans shell, ne devriez-vous pas considérer Python à la place? – jldupont

+0

Il serait utile si vous avez dit quel shell vous utilisez. –

+0

Il a dit qu'il utilise sh shell – AQU

Répondre

1

Eh bien, bash avoir des tableaux, voir man bash. Le shell posix générique ne le fait pas.

Le shell n'est pas précisément un macro-processeur, donc toute métaprogrammation doit être traitée par un eval ou, en bash, avec la syntaxe ${!variable}. Autrement dit, dans un macro-processeur comme nroff, vous pouvez facilement truquer les tableaux en créant des variables appelées a1, a2, a3, a4, etc.

Vous pouvez le faire dans le shell posix mais cela nécessite beaucoup d'eval ou l'équivalent comme $(($a)).

$ i=1 j=2; eval a$i=12 a$j=34 
$ for i in 1 2; do echo $((a$i)); done 
12 
34 
$ 

Et pour un exemple bash spécifique ...

$ a=(56 78) 
$ echo ${a[0]} 
56 
$ echo ${a[1]} 
78 
$ 
3

En supposant bash

array1=(mazda toyota honda) 
array2=(2009 2006 2010) 

for index in ${!array1[*]} 
do 
    printf "%s %s\n" ${array1[$index]} ${array2[$index]} 
done 
+0

dans mon shell, il doit être array1 = "mazda toyota honda" sinon je reçois une erreur de syntaxe – goe

+0

et quel shell est-ce? –

1

Vous pouvez utiliser des tableaux, mais juste pour être différent ici est une méthode qui ne les ont pas besoin:

LIST1="mazda toyota honda" 
LIST2="2009 2006 2010" 

paste -d' ' <(echo $LIST1 | tr ' ' '\n') <(echo $LIST2 | tr ' ' '\n') 
1

Vous pouvez utiliser la variable $ IFS pour fausser des tableaux par exemple (fonctionne avec n'importe quel shell de compilateur posix):

hosts=mingw:bsd:linux:osx # for example you have the variable with all aviable hosts 
    # the advantage between other methods is that you have still one element and all contens get adressed through this 
    old_ifs=$IFS #save the old $IFS 
    IFS=: # say sh to seperate all commands by : 
    for var in $hosts ; do 
    # now we can use every element of $var 
    IFS=$old_ifs 
    echo $var 
    done 
    IFS=$Old_ifs 

Si vous intégrez ceci dans une fonction, vous pouvez les utiliser comme un vrai tableau

+0

Pour améliorer la qualité de votre message, veuillez indiquer pourquoi/comment votre réponse résout le problème. –

Questions connexes