内部引用符は役に立ちません。使用しないでください。の場合myvar="\"foo\""
、外側の引用符は構文ですが、内側の引用符はデータです。データである引用符は、シェルによって文字列分割の目的で使用されることはなく、後で構文に戻ることはありません (eval
多くの新しい問題を引き起こす を使用しない限り、それらの多くはセキュリティに影響します)。それらが行うのは、実際のコマンドが必要としない、または必要としないデータを追加することだけです。
文字列の分割とグロブの展開を防ぐために、展開の前後に構文引用符が必要です。次の 4 つの例を比較してください (正しいのは最初の例だけです)。
do_something_with() {
printf '<%s> ' "$@"
echo
}
myvar="Hello Stackoverflow"
do_something_with "$myvar" # output: <Hello Stackoverflow>
do_something_with $myvar # output: <Hello> <Stackoverflow>
myvar2="\"Hello Stackoverflow\""
do_something_with $myvar2 # output: <"Hello> <Stackoverflow">
do_something_with "$myvar2" # output: <"Hello Stackoverflow">
変数に複数の引数として解釈されるべきものを格納したい場合、使用する適切なものは配列です:
my_array=( Hello "Stack Overflow" )
do_something_with "${my_array[@]}" # output: <Hello> <Stack Overflow>
http://mywiki.wooledge.org/BashFAQ/050も参照してください。