bash 스크립트는 다른 인수로 자신을 호출합니다.

bash 스크립트는 다른 인수로 자신을 호출합니다.

나는 그것을 할 수 없습니다.

이 스크립트는 target과 command라는 두 가지 매개변수를 사용합니다. 유효한 대상이 배열에 지정되어 있습니다. 대상이 "all"인 경우 스크립트는 모든 대상을 반복해야 합니다.

#!/bin/bash
# recur.sh

targets=('aaa' 'bbb' 'ccc' 'ddd')

if [ "$1" == "all" ] ; then
    for i in $targets ; do
        echo $2" --> "$i
        ./$0 $i $2
    done
    exit 0
fi

echo "Target "$1" just received command '"$2"'"

exit 0

다음과 같은 결과가 나올 것으로 예상됩니다.

$ recur all boggle
boggle --> aaa
Target aaa just received command 'boggle'
boggle --> bbb
Target bbb just received command 'boggle'
boggle --> ccc
Target ccc just received command 'boggle'
boggle --> ddd
Target ddd just received command 'boggle'

그러나 스크립트는 첫 번째 반복에서 종료됩니다.

$ recur all boggle
boggle --> aaa
Target aaa just received command 'boggle'

답변1

문제는 재귀가 아니라 반복 항목에 있습니다. 위의 방법을 시도하면 원하는 결과를 얻을 수 없습니다.

$ targets=(aaa bbb ccc ddd)
$ for i in $targets; do echo $i; done
aaa

배열을 반복하려면 배열의 항목 목록을 생성해야 합니다. 예를 들면 다음과 같습니다.이 링크:

그래서 당신은

#!/bin/bash
# recur.sh

targets=('aaa' 'bbb' 'ccc' 'ddd')

if [ "$1" == "all" ] ; then
    for i in ${targets[@]}; do
        echo $2" --> "$i
        ./$0 $i $2
    done
    exit 0
fi

echo "Target "$1" just received command '"$2"'"

exit 0

답변2

다른 사람들은 목록에 접근할 때 사용되는 구문에 문제가 있다고 지적했습니다. 그러나 이것이 스크립트의 유일한 문제는 아닙니다. 또한 따옴표 없이 변수를 사용했습니다. 따옴표 없이 사용할 경우 $variablename변수에 쉘이 해석할 수 있는 문자가 포함되어 있으면 예상치 못한 결과가 발생합니다.

이러한 문제를 피하기 위해 스크립트를 변경하는 방법은 다음과 같습니다.

#!/bin/bash
# recur.sh

targets=('aaa' 'bbb' 'ccc' 'ddd')

if [ "$1" == "all" ] ; then
    for i in "${targets[@]}"; do
        echo "$2 --> $i"
        "$0" "$i" "$2"
    done
    exit 0
fi

echo "Target $1 just received command '$2'"

exit 0

특별한 이유가 없는 한 항상 변수 사용을 큰따옴표로 묶는 습관을 들여야 합니다.

답변3

$targets문제는 대신 를 사용하고 있기 때문에 배열의 모든 요소를 ​​반복하는 것이 아니라 단 하나의 요소만 반복한다는 것입니다 ${targets[@]}.

다음 수정 사항을 시도해 보세요.

targets=('aaa' 'bbb' 'ccc' 'ddd')

if [ "$1" == "all" ] ; then
    for i in ${targets[@]} ; do
        echo $2" --> "$i
        echo "Target "$i" just received command '"$2"'"
    done
fi

exit 0

여기서는 재귀가 필요하지 않습니다.

관련 정보