Передача значений массива в аргументы команды

Передача значений массива в аргументы команды

Я пытаюсь написать скрипт, который выполняет команду для каждого элемента массива, независимо от количества значений в нем. Однако единственное решение, которое приходит мне в голову, это следующее (сделано с командой 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

Связанный контент