パラメータ拡張時に引用符を正しく処理します。

パラメータ拡張時に引用符を正しく処理します。

デフォルト値を使用してIFS検討してください。

unset var
set -- ${var:-"hello"}
echo "$#"

1これは、パラメータ拡張が単一の文字列に展開されると印刷されますhello

unset var
set -- "${var:-"hello"}"
echo "$#"

これも1同じ理由で出力されます。

ただしksh93、次は使用されている場合は3while dashbashおよび出力をpdksh出力します。zsh1

unset var
set -- "${var:-" hello "}"
echo "$#"

このksh93場合、3合計"$@"は2つの空の文字列であり、合計は横にスペースがない文字列$1です。拡張コマンドは別のシェルにあるようです。$3$2helloset -- "" hello ""ksh93set -- " hello "

関連する(私の考えでは)質問は次のとおりです。

unset var
set -- ${var:-""}
echo "$#"

1出力される場所をsh除いて、すべての同様のシェルから出力されます。フィールド分割を実行する前に、空の文字列から引用符が削除されたように見えます。ksh930ksh93

ksh93POSIXで拡張などを実行する必要があると言う方法で動作が説明されサポートされていますか?

シェル間で動作が異なる2つの例のうち、最後のケースは個人的にバグだと思います(コマンドはではなくからset -- ${var:-""}拡張する必要があります)。しかし、最初の例では(Sure。set -- ""set --set -- "${var:-" hello "}"


テストのために、ksh93OpenBSD 6.4では「Version AJM 93u+ 2012-08-01」を使用し、シェルの現在開発バージョンである「Version A 2017.0.0-devel-2040-g36a76aca」を使用しています。

ベストアンサー1

おすすめ記事