Как я могу использовать массивы в Unix Shell? - PullRequest
3 голосов
/ 28 ноября 2009

Я использую код в! / Bin / sh так:

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

for m in $LIST1
do
 echo $m
done

Как вы видите, в данный момент распечатывается только марка автомобиля. Как я могу включить год в каждое «эхо» на основе одних и тех же позиций, чтобы получить результаты вроде:

Мазда 2009

Тойота 2006

Honda 2010

Ответы [ 4 ]

3 голосов
/ 28 ноября 2009

Принимая bash

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

for index in ${!array1[*]}
do
    printf "%s %s\n" ${array1[$index]} ${array2[$index]}
done
1 голос
/ 25 августа 2012

Например, вы можете использовать переменную $ IFS для подделки массивов (работает с любой компиляторной оболочкой 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

Если вы заключите это в функцию, вы можете использовать их как реальный массив

1 голос
/ 28 ноября 2009

Вы можете использовать массивы, но для отличия вот метод, который не нуждается в них:

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

paste -d' ' <(echo $LIST1 | tr ' ' '\n') <(echo $LIST2 | tr ' ' '\n')
1 голос
/ 28 ноября 2009

Ну, у bash есть массивы, см. man bash. Общей оболочки posix нет.

Однако оболочка не является точно макропроцессором, поэтому любое метапрограммирование должно обрабатываться с помощью eval или, в bash, с синтаксисом ${!variable}. То есть в макропроцессоре, таком как nroff, вы можете легко подделать массивы, создав переменные с именами a1, a2, a3, a4 и т. Д.

Вы можете сделать это в оболочке posix, но для этого требуется много eval или эквивалента, например $(($a)).

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

А для примера, относящегося к bash ...

$ a=(56 78)
$ echo ${a[0]}
56
$ echo ${a[1]}
78
$ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...