args 명령에 배열 값 전달

args 명령에 배열 값 전달

배열의 값 개수에 관계없이 배열의 각 요소에 명령을 실행하는 스크립트를 작성하려고 합니다. 그러나 내가 생각해낸 유일한 해결책은 다음과 같습니다( 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

관련 정보