bashは余分な単一引用符を追加します


12

スクリプトの実行に問題があります。
デバッグモード(bash -x)で実行すると、bashが余分な引用符を追加していることがわかります。そのため、私のスクリプトは失敗しています。

これは私のスクリプト内です:

testvar="\"sudo /home/pi/shared/blink.sh 27 off\""
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 ${testvar}

これは出力です:

ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 192.168.42.105 '"sudo' /home/pi/shared/blink.sh 27 'off"'

回答:


7

Bashは、有効な入力構文であるコマンドを表示するために、単一引用符を表示しています。コマンドのパラメーターにこれらの単一引用符を含むコマンドは実行していませんssh

ssh  '"sudo' /home/pi/shared/blink.sh 27 'off"'

sshコマンドの最後の4つのパラメータであることを示しています"sudo/home/pi/shared/blink.sh27off"

リモートホストでは、sshデーモンがコマンドの単語を区切り文字としてスペースで結合するため、実行しているリモートコマンドは

"sudo /home/pi/shared/blink.sh 27 off"

これは名前がのコマンドを実行しようとしますがsudo /home/pi/shared/blink.sh 27 off、もちろん存在しません。

の定義から二重引用符を削除しますtestvar

ここでは重要ではありませんが、おそらく実際のケースでは重要です:の代わりに(または、必要な場合は中括弧はオプションです)を${testvar}記述します。変数を除外する必要がある理由がわからない限り、変数の置換は常に二重引用符で囲みます。変数の値に展開され、一方でないときは二重引用符の扱いでの値グロブパターンのような空白で区切られたリスト。"$testvar""${testvar}""$testvar"testvar$testvartestvar


3

私はあなたが使うべきだと思う:

testvar="sudo /home/pi/shared/blink.sh 27 off"
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 "${testvar}"

これは私のために働いています:

$ bash -x -c 'testvar="la la la"; echo "${testvar}"'
+ testvar='la la la'
+ echo 'la la la'
la la la

しかし、あなたが書いたのと同じように書くと、同じ間違った結果が得られます:

$ bash -x -c 'testvar="\"la la la\""; echo ${testvar}'
+ testvar='"la la la"'
+ echo '"la' la 'la"'
"la la la"

引用符は、複数の単語をグループ化して単一の引数を形成するシェルのメカニズムであるため、重要です。
グレンジャックマン14年

2

シェルは変数の値を単語に分割します。分割しないように二重引用符で囲みます。違いを見ます:

t='"a b c"'
set -xv
echo $t
echo "$t"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.