2012-09-07 1 views
26

этот вопрос не является такой же, как Does the shell support sets?ли linux оболочка поддерживает структуру данных списка?

я знаю много поддержки языка сценария списка структуры, такие, как питон, Python, Ruby и JavaScript, так что насчет Linux оболочки?

ли оболочка поддерживает такой синтаксис?

for i in list: 
do 
    print i 
done 

я бы первым, чтобы инициализировать список, например:

ListName = [ item1, item2, ..., itemn ] 

затем итерацию над ним

является то, что возможно при программировании скриптов?

+1

Обратите внимание, что оболочка Bourne shell/POSIX не имеет массивов. Но 'для элемента в списке элементов; do', безусловно, поддерживается во всех оболочках. Обратите также внимание на удобное использование globbing для перебора множества файлов; 'для файла в * .dat' строит список токенов, расширяя подстановочный знак (хотя, к сожалению, многим пользователям удается разрушить его, выполняя что-то вроде' для файла в $ (ls a * .dat) '). – tripleee

ответ

45

Он поддерживает списки, но не как отдельную структуру данных (игнорируя массивы на данный момент).

В for итерации цикла по списку (в общем смысле) из белого пространства разделенных значений, независимо от того, как создается этот список, будь то в буквальном смысле:

for i in 1 2 3; do 
    echo "$i" 
done 

или с помощью расширения параметра:

listVar="1 2 3" 
for i in $listVar; do 
    echo "$i" 
done 

или команды подстановки:

for i in $(echo 1; echo 2; echo 3); do 
    echo "$i" 
done 

ARRA y - это просто специальный параметр, который может содержать более структурированный список значений, где каждый элемент может содержать пробелы. Сравните разницу:

array=("item 1" "item 2" "item 3") 
for i in "${array[@]}"; do # The quotes are necessary here 
    echo "$i" 
done 

list='"item 1" "item 2" "item 3"' 
for i in $list; do 
    echo $i 
done 
for i in "$list"; do 
    echo $i 
done 
for i in ${array[@]}; do 
    echo $i 
done 
+0

Что означает @? –

+2

Это специальный индекс, который заставляет расширение создавать все элементы массива, а не только один конкретный элемент. – chepner

+0

Я не понял почему 'for i in '$ {array [@]}"; 'печатает 3 строки. Поскольку 'echo $ {array [@]}' печатает одну строку 'item 1 item 2 item 3', я бы ожидал, что' for i in '$ {array [@]} ";' преобразуется в 'for i in «пункт 1, пункт 2, пункт 3»; '; так что это приведет к одной строке 'item 1 item 2 item 3'.Что мне не хватает? Заранее спасибо – Svech87

7

Для составьте список, просто сделать это

colors=(red orange white "light gray") 

Технически это массив, но - конечно - он имеет все функции списка.
Даже список python реализованы с массивом

+1

Чтобы перебрать массив, используйте 'для элемента в $ {colors [*]}; do echo $ item; done' – neevek

+8

@Neevek, который не будет делать то, что вы думаете, что он делает; «светло-серый» будет рассматриваться как два элемента «светлый» и «серый». Вам нужно использовать '' $ {colors [@]} "' ('@' not '*' и процитировать). – chepner

+0

Почему «светло-серый» будет рассматриваться как два элемента, когда * используется? где я могу найти документы для таких деталей? человек sh? – hugemeow