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
コメントまたは改行フラグを使用して調整することもできます。詳細を参照)、最初のレベルの参照を削除します。Z
info zsh flags
Q
ではbash
いつでも次のことができます。
readarray -td '' words < <(
export MYCONFIG
zsh -c 'print -rNC1 -- ${(z)MYCONFIG}'
)
printf '[%s]\n' "${words[@]}"
zsh
NULで区切られた単語をトークン化して渡しますbash
。
この場合、フラグを追加することは、追加のNULを追加することとQ
同様に問題になる可能性があります。しかし、とにかく、変数の内容にNULを持つことができないという事実とは対照的に、NULを削除することをお勧めします。$MYCONFIG
$'\0'
bash
zsh
zsh
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
フラグは引用符で囲まれていない空白による分割を許可しません。