0

コード:

path=$PATH:
while [ -n $path ]
do 
ls -ld ${path%%:*}
path=${path#*:}
done

パスの各部分を取得したいのですが、スクリプトを実行するとwhile処理から抜け出せません。理由を教えてください。「while [ -n $path ]」に何か問題がありますか?</p>

4

3 に答える 3

4

最終的なカットで空の文字列が作成されることはありません。a:b:cがある場合は、a、bの順に削除しますが、cは削除しません。つまり、これ:

${path#*:}

パスの最後の部分の文字列は常に空ではなくなります。-nチェックは空の文字列を探すため、ループは永久に実行されます。

于 2012-04-11T13:30:17.157 に答える
0

$pathコロンが含まれていない場合は、${path#*:}を返し$pathます。つまり、無限ループがあります。

p="foo"
$ echo ${p#*:}
foo
$ p="foo:bar"
$ echo ${p#*:}
bar
于 2012-04-11T13:32:19.997 に答える
0

コードにいくつかのバグがあります。これでうまくいくはずです:

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これがループから抜け出せない主な理由です。

于 2012-04-11T13:46:51.043 に答える