ZSHパラメータ拡張フラグがこの文字列に適用されないのはなぜですか?

ZSHパラメータ拡張フラグがこの文字列に適用されないのはなぜですか?

パラメータ拡張フラグは、u一意の配列値のみを出力する必要があります。時にはそうです。

$ stuff=(a b a c)
$ echo ${(u)stuff}
a b c
$ cat <<< ${(u)stuff}
a b a c

何を提供しますか?

答え1

では、配列の3つの固有の要素が渡されます(空の要素は省略されています)echo ${(u)stuff}echoあなたは単純なコマンドの引数を取得するリストのコンテキストにあります。

$ printf '"%s"\n' ${(u)stuff}
"a"
"b"
"c"

ただし<<<、リストではなくコンテキストの後にはcat標準入力が1つだけで、標準入力を<<<構成するために一時ファイルに保存する項目が1つしかないため、配列catの要素はの最初の文字に関連付けられます$IFS。同じ:

echo "$stuff"
scalar=$stuff
[[ $stuff = x ]]
case $stuff... in
...

すべての場合で1つのパラメータのみが予想され、より多くのパラメータは意味がありません。

ここでは、次のようにすれば十分です。

cat <<< ${${(u)stuff}}

まず、フラグを適用し、u外部レイヤーから接続を作成します。

同じ:

scalar=${${(u)stuff}}

しかし、以下が必要です。

$ printf '"%s"\n' "${${(@u)stuff}}"
"a b c"

内部拡張のリストコンテキストを強制的に適用し、外部拡張でIFS結合を実行しますprintf

$IFSたとえば、グローバルパラメータに依存するのではなく、配列要素の連結方法を明示的に指定できます。

printf '"%s"\n' ${(j[ ])${(u)stuff}}
cat <<< ${(j[ ])${(u)stuff}}

より拡張ルールもっと学ぶ。

関連情報