주어진 디렉토리의 모든 파일과 디렉토리를 나열하는 스크립트를 만들려고 합니다. 나는 이 스크립트가 자신을 호출하고 결국 모든 파일과 디렉터리를 표시하기를 원합니다. 나는 당신이 이것을 쉽게 할 수 있다는 것을 알고 있습니다찾다, 하지만 나는 원한다재귀 스크립트 연습, 내 재귀 매개 변수가 내가 예상한 것과 왜 다른지 모르겠습니다. 해당 값은 변경되지 않습니다.
for source in `find $1 -maxdepth 1 -type d,f`
do
if [ -f $source ]; then
echo "`basename $source` is a file"
fi
if [ -d $source ]; then
echo "`basename $source` is a directory"
. Script.sh $source
fi
done
답변1
다음 줄이 범인입니다.
. Script.sh $source
이런 방식으로 재귀를 수행하는 것을 상상할 수 있지만 다음 수준의 재귀에서 변경된 변수도 호출자에서도 변경되기 때문에 추론하기가 어렵습니다. 어쩌면 당신은 그것을 얻지 않고 그것을 부르고 싶을 수도 있습니다 :
Script.sh $source
또는 더 나은 방법은 다음과 같습니다.
"$0" "$source"
하지만 모든 경우에 안정적으로 소스 스크립트를 얻는 것은 약간 까다롭습니다. 더 나은 방법은 (Bash에서) 재귀 함수를 사용하는 것입니다.
function f()
{
...
f different_args
...
}
f
local
에 대한 재귀 호출로 인해 변경되지 않도록 에서 사용된 모든 변수를 선언합니다 f
.