나는 그것을 할 수 없습니다.
이 스크립트는 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
여기서는 재귀가 필요하지 않습니다.