Shift; Bashを使用すると、Shift対Shift 2

Shift; Bashを使用すると、Shift対Shift 2

shift; shiftbashを使うよりも良い文を見つけましたが、shift 2説得力のある説明が必要です。shift; shift位置パラメータが渡される方法に問題がある場合はどうなり、問題をより適切に処理できるのですか?

ベストアンサー1

shift 2位置引数が1つしかない場合は失敗します。パラメータは次のとおりです。

$ set -- abc
$ shift; shift
$ echo "exit status $? args left $# first arg expands to '$1'"
exit status 1 args left 0 first arg expands to ''

$ set -- abc
$ shift 2
$ echo "exit status $? args left $# first arg expands to '$1'"
exit status 1 args left 1 first arg expands to 'abc'

shiftどちらの場合も、最新のシャットダウンが失敗したため、両方ともシャットダウンステータス1を表示します。最初のケースでは、最初のケースではshift個々の位置パラメータがクリアされました。

それがバッシュのことです。一部のシェルでは、実際の数よりも多くの位置引数を移動しようとすると、シェルがエラーで終了する可能性があります。

$ dash -c 'set -- abc; shift 2; echo end'
dash: 1: shift: can't shift that many

これはパラメータ解析ループで発生する可能性があります。例えば

while [ "$#" -gt 0 ]; do
    # ...
    if [ "$1" = -f ]; then
        file=$2
        shift 2;
    fi
done`

その後、後で引数なしで提供すると、-fBashは無限ループに陥ります。 doubleの場合は空の文字列にshift設定され、後でより意味のあるエラー(「ファイルが見つかりません」など)が発生する可能性があります。fileもちろん、$2これを設定するかどうかを確認することでより正確に行うことができますが、getopt何でも可能です。

おすすめ記事