1

次の小さな例を見てください。

#!/bin/bash -x
myvar="\"Hello Stackoverflow\""
ping $myvar

この結果、任意のコマンド (ここでは ping は単なる例です) は、'Hello' と 'Stackoverflow' の間の空白を改行またはキャリッジ リターンとして自動的に認識します。

#  ./test.sh
+ myvar='"Hello Stakeoverflow"'
+ ping '"Hello' 'Stakeoverflow"'
ping: unknown host "Hello

これをオーバーライドできる方法はありますか?

ping の使用は無視してください。単語を ping できないことは理解しています。変数がシェル コマンドの引数として指定されたときにどのように処理されるかの例を示すのに役立つだけなので、それを示すにはエラーが必要です。

4

2 に答える 2

3

内部引用符は役に立ちません。使用しないでください。の場合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も参照してください。

于 2013-03-19T17:28:12.123 に答える
0

変数を二重引用符で囲む必要があります

ping "$myvar"
于 2013-03-19T17:21:09.673 に答える