web-dev-qa-db-ja.com

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

スクリプトの実行に問題があります。
デバッグモードで実行すると(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"'
14
user2452585

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

_ssh … '"Sudo' /home/pi/shared/blink.sh 27 'off"'
_

sshコマンドの最後の4つのパラメーターが_"Sudo_、_/home/pi/shared/blink.sh_、_27_および_off"_であることを示します。

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

_"Sudo /home/pi/shared/blink.sh 27 off"
_

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

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

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

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

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"
3
Radu Rădeanu

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

t='"a b c"'
set -xv
echo $t
echo "$t"
2
choroba