Bashの一重引用符の問題

Bashの一重引用符の問題

dzen2を初期化するshスクリプトがあり、そこからSource Code Proフォントを使用したいと思います。コードは次のとおりです。

param="-p -dock -fn 'Source Code Pro-10'"

# the generated_output function is not important
generated_output | dzen2 $param

問題は、スクリプトが機能しないということです! dzen2が起動しません...数回検索した結果、一重引用'符または二重引用符の問題によって問題が発生する可能性があることがわかりましたが、よく理解されていませ"ん...

私はこれを使ってみました:

param=$'-p -dock -fn \'Source Code Pro-10\''
# or something like this
param='-p -dock -fn '"'"'Source Code Pro-10'"'"

それでも動作しません...
このスクリプトには何がありますか?

答え1

複数の個々の文字列(パラメータ)を追跡し、後で別々の文字列として使用する場合は、同じ文字列に保存しないでください。代わりに配列を使用してください。

param=(-p -dock -fn 'Source Code Pro-10')
generated_output | dzen2 "${param[@]}"

引用符付き拡張は"${param[@]}"配列の文字列リストに展開されますparam。これは次の意味ですSource Code Pro-10一つ議論、それはあなたが望むものです。周囲の引用符を拡張することを忘れた場合、シェルは引き続き$IFS各文字列を文字(デフォルトではスペース、タブ、および改行)で分割し、結果の単語ごとにファイル名のグロービングを適用します。

コードはシェルを使用して、文字列をコマンド-p -dock -fn 'Source Code Pro-10'の引数に分割します。シェルはデフォルトで空白、タブ、および改行文字に分割されるため、部分文字列は'Source Code Pro-10'別々の引数になります'Source。 (単一引用符も文字列に含まれることに注意してください)CodePro-10'

関連:


shスクリプトでは、位置引数のリストを使用できます。

set -- -p -dock -fn 'Source Code Pro-10'
generated_output | dzen2 "$@"

これはシェルでも機能しますbash

関連情報