Bash:配列を使用せずに複数の引数を含む変数内でスペースでシェル引数を引用する方法は? [コピー]

Bash:配列を使用せずに複数の引数を含む変数内でスペースでシェル引数を引用する方法は? [コピー]

Bashでは、引用符内のスペースに分割せずに適切に引用されたオプションのリストを使用してコマンドに変数を渡すことはできますか? IOW、このスクリプトは次のとおりです。

MYCONFIG="--hi FOO=bar 'X=ABC 123'"
printf '[%s]\n' $MYCONFIG

出力:

[--hi]
[FOO=bar]
['X=ABC]
[123']

私が出力したいのは

[--hi]
[FOO=bar]
['X=ABC 123']

配列でこれを行うことができることに気づきました。または関数としてしかし、私は一緒に働いています。引数を保持するためにすでに文字列変数の作成に依存しているスクリプト。できない機能と交換スクリプトの他のユーザーはエラーを受け取るからです。

引用符付き文字列内のスペースが破損するのを防ぐために、正しい引用符で文字列を整理することは可能ですか?

失敗した場合はどうすれば修正できますか?スクリプトアレイ構成と既存の文字列構成をサポートします。どちらか一方を別のものに変換できますか?

答え1

では、zsh次の操作を行います。

$ MYCONFIG="--hi FOO=bar 'X=ABC 123'"
$ printf '[%s]\n' ${(z)MYCONFIG}
[--hi]
[FOO=bar]
['X=ABC 123']
$ printf '[%s]\n' "${(Q@)${(z)MYCONFIG}}"
[--hi]
[FOO=bar]
[X=ABC 123]

パラメータz拡張フラグはシェルトークン化を使用して入力を中断し(zsh構文に基づいており、このフラグはzコメントまたは改行フラグを使用して調整することもできます。詳細を参照)、最初のレベルの参照を削除します。Zinfo zsh flagsQ

ではbashいつでも次のことができます。

readarray -td '' words < <(
  export MYCONFIG
  zsh -c 'print -rNC1 -- ${(z)MYCONFIG}'
)
printf '[%s]\n' "${words[@]}"

zshNULで区切られた単語をトークン化して渡しますbash

この場合、フラグを追加することは、追加のNULを追加することとQ同様に問題になる可能性があります。しかし、とにかく、変数の内容にNULを持つことができないという事実とは対照的に、NULを削除することをお勧めします。$MYCONFIG$'\0'bashzshzsh

readarray -td '' words < <(
  export MYCONFIG
  zsh -c '
    quoted_words=( ${(z)MYCONFIG} )
    unquoted_words=( "${(Q@)quoted_words}" )
    without_nul=( "${(@)unquoted_words//$'\''\0'\''}" )
    print -rNC1 -- "${without_nul}"
  '
)

答え2

少し調整すると(一重引用符を犠牲にする必要があります):

xargs -n1 printf "[%s]\n" <<<"$MYCONFIG"
[--hi]
[FOO=bar]
[X=ABC 123]

ユーティリティはフラグでパラメータを区別xargsできます-n。残念ながら、この-Iフラグは引用符で囲まれていない空白による分割を許可しません。

関連情報