デフォルト値を使用してIFS
検討してください。
unset var
set -- ${var:-"hello"}
echo "$#"
1
これは、パラメータ拡張が単一の文字列に展開されると印刷されますhello
。
unset var
set -- "${var:-"hello"}"
echo "$#"
これも1
同じ理由で出力されます。
ただしksh93
、次は使用されている場合は3
while dash
、bash
および出力をpdksh
出力します。zsh
1
unset var
set -- "${var:-" hello "}"
echo "$#"
このksh93
場合、3
合計"$@"
は2つの空の文字列であり、合計は横にスペースがない文字列$1
です。拡張コマンドは別のシェルにあるようです。$3
$2
hello
set -- "" hello ""
ksh93
set -- " hello "
関連する(私の考えでは)質問は次のとおりです。
unset var
set -- ${var:-""}
echo "$#"
1
出力される場所をsh
除いて、すべての同様のシェルから出力されます。フィールド分割を実行する前に、空の文字列から引用符が削除されたように見えます。ksh93
0
ksh93
ksh93
POSIXで拡張などを実行する必要があると言う方法で動作が説明されサポートされていますか?
シェル間で動作が異なる2つの例のうち、最後のケースは個人的にバグだと思います(コマンドはではなくからset -- ${var:-""}
拡張する必要があります)。しかし、最初の例では(Sure。set -- ""
set --
set -- "${var:-" hello "}"
テストのために、ksh93
OpenBSD 6.4では「Version AJM 93u+ 2012-08-01」を使用し、シェルの現在開発バージョンである「Version A 2017.0.0-devel-2040-g36a76aca」を使用しています。