Я хочу использовать for цикла с массивом. Я использовал следующую команду для этого:

#! /bin/bash
rm -f /orch/list

arrayVM=($(cat /orch/servers | grep $1 | awk '{print $1}'))
for i in $arrayVM
do
        echo ${arrayVM[$i]}>>list
done

Но когда я проверяю файл list я вижу только первый элемент массива arrayVM . Что не так с моей командой?

2 ответа2

4

Принцип ошибки в том , что for i in $arrayVM устанавливает i к первому элементу в arrayVM так как там нет индекса. Я удивлен, что это не выдает ошибку команды echo , если только первый элемент массива не числовой.

То, что вам нужно, это итеративная форма for:-

for (( i=0; i<${#arrayVM[*]}; ++i ))
do
    echo ${arrayVM[$i]}>>list
done

Тем не менее, это излишне многословно: гораздо проще:

for e in "${arrayVM[@]}"
do
    echo $e>>list
done

Это присваивает e каждому элементу по очереди, не перечисляя их.

В свете ответа Fedorqui, если arrayVM не нужна где-то еще, существует гораздо более простой способ создания файла списка:-

cat /orch/servers | grep $1 | awk '{print $1}' >/orch/list

Или, так как cat не нужна:

grep $1 </orch/servers | awk '{print $1}' >/orch/list
0

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

while IFS= read -r value _;
do
        echo "$value" >> list
done < <(grep "$1" /orch/servers)

При read -r value _ мы сохраняем первое поле в $value а остальное - в переменной $_ .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .