
Я пытаюсь написать скрипт, который выполняет команду для каждого элемента массива, независимо от количества значений в нем. Однако единственное решение, которое приходит мне в голову, это следующее (сделано с командой watch
в качестве примера):
watch ${ARRAY[0]}
watch ${ARRAY[1]}
watch ${ARRAY[2]}
…будучи массивом, размещает другие команды, за которыми нужно следить.
Очевидно, это определенно не то, что я ищу, поскольку это зависит от количества позиций массива, которые я пишу в своем коде, и это явно проблема. Я пробовал что-то вроде:
watch "${ARRAY[*]}"
…но это не сработало, с двойными кавычками или без них. Любые предложения будут оценены.
решение1
Во-первых, вы почти никогда не должны использовать ${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