コード:
path=$PATH:
while [ -n $path ]
do
ls -ld ${path%%:*}
path=${path#*:}
done
パスの各部分を取得したいのですが、スクリプトを実行するとwhile処理から抜け出せません。理由を教えてください。「while [ -n $path ]」に何か問題がありますか?</p>
最終的なカットで空の文字列が作成されることはありません。a:b:cがある場合は、a、bの順に削除しますが、cは削除しません。つまり、これ:
${path#*:}
パスの最後の部分の文字列は常に空ではなくなります。-nチェックは空の文字列を探すため、ループは永久に実行されます。
$path
コロンが含まれていない場合は、${path#*:}
を返し$path
ます。つまり、無限ループがあります。
p="foo"
$ echo ${p#*:}
foo
$ p="foo:bar"
$ echo ${p#*:}
bar
コードにいくつかのバグがあります。これでうまくいくはずです:
path=$PATH
while [[ $path != '' ]]; do
# you can replace echo to whatever you need, like ls -ld
echo ${path%%:*}
if echo $path | grep ':' >/dev/null; then
path=${path#*:}
else path=''
fi
done
が初期path
化された後、常にテストをチェックTrue
し[ -n path ]
ます。while
これがループから抜け出せない主な理由です。