Я пытаюсь написать скрипт, который выполняет команду для каждого из элементов массива, независимо от количества значений в нем. Тем не менее, единственное решение, которое я придумаю, это следующее (сделанное с помощью команды watch в качестве примера):

watch ${ARRAY[0]}

watch ${ARRAY[1]}

watch ${ARRAY[2]}

… Будучи массивом, позиционирует другие команды для просмотра.

Очевидно, что это определенно не то, что я ищу, так как это зависит от количества позиций массива, которые я пишу в своем коде, и это явно проблема. Я пробовал что-то вроде:

watch "${ARRAY[*]}"

... но это не сработало, с двойными кавычками или без них. Любое предложение будет оценено.

1 ответ1

3

Во-первых, вы почти никогда не должны использовать ${ARRAY[*]} , с кавычками или без них. Почти во всех ситуациях вы должны использовать вместо этого "${ARRAY[@]}" (с двойными кавычками). Во-вторых, вы должны использовать имена переменных в нижнем или смешанном регистре, чтобы избежать случайного использования имени, которое означает что-то особенное для оболочки или одной из программ, которые вы запускаете из нее.

Теперь для вашего реального вопроса: вы пытаетесь запустить watch один раз и передать ему полный список элементов в массиве, или вы хотите запустить его отдельно для каждого элемента по одному, или запустить отдельный экземпляр watch для каждого элемента сразу? Чтобы запустить его один раз с полным списком, используйте:

watch "${array[@]}"

Чтобы запустить его отдельно для каждого элемента по одному, используйте:

for element in "${array[@]}"; do
    watch "$element"
done

Чтобы запустить его отдельно для каждого элемента сразу, используйте & чтобы не дождаться завершения каждой команды watch перед запуском следующей:

for element in "${array[@]}"; do
    watch "$element" &
done
wait   # this waits for all of the `watch` processes to exit before continuing through the script

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