2017-04-23 10 views
0

変数の中で一重引用符をエスケープする必要があります。シェルスクリプトの一重引用符をエスケープする

ssh_command 'file=$(hostname)_server-setup_$(date +%Y-%m-%d).tar.gz && cd /var && tar -zcvf $file ini | wc -l | xargs printf \'Num files: %d, File: $file\'' 

私は二重引用符で変数を囲むことができますが、その変数が宣言されたときに内部変数が評価され、そしてそれは私が欲しいものではありません。

ssh_command "file=$(hostname)_server-setup_$(date +%Y-%m-%d).tar.gz && cd /var && tar -zcvf $file ini | wc -l | xargs printf 'Num files: %d, File: $file'" 

は今、このが出ているが、SSHを介して複雑なコマンドの上に送信する場合、その後$fileがちょうど$file

ssh_command(){ 
    ssh [email protected] $1 
} 

ssh_command 'file=$(hostname)_server-setup_$(date +%Y-%m-%d).tar.gz && cd /var && tar -zcvf $file ini | wc -l | xargs printf '"'"'Num files: %d, File: $file'"'" 

出力

Num files: 61, File: $file 
+0

ここで希望の出力とは何ですか。 $ fileの値は何ですか? – OscarAkaElvis

+3

[一重引用符で囲まれた文字列でシングルクォートをエスケープする方法](http://stackoverflow.com/questions/1250079/how-to-escape-single-quotes-within-single-quoted-strings) –

+0

出力は 'Num files:x、File:/ path/to/tar' – clarkk

答えて

3

私はそれをovercomplicate、元の二重引用符に固執し、ちょうど$を逃れられないだろうローカルに展開するべきではありません。

ssh_command "file=\$(hostname)_server-setup_$(date +%Y-%m-%d).tar.gz && cd /var && tar -zcvf \$file ini | wc -l | xargs printf 'Num files: %d, File: \$file'" 
3

として印刷されている更新(引用符、ドル記号、セミコロンを使用して)、私はbase64それをエンコード/デコードする。ここで私はbase64_ssh.bashを作った:

上記の例で
#!/bin/bash 
script64=$(cat script.txt | base64 -w 0) 
ssh 127.0.0.1 "echo $script64 | base64 -d | bash" 

、単にあなたがscript.txtで、リモートサーバ上で実行して、bashスクリプトを実行したいコマンドを置きます。

これには1つの余分なファイルが必要ですが、引用符やその他の特殊文字をエスケープする必要がないので、これは私の意見ではより良い解決策になります。

これは機能の作成にも役立ちます。

これは、より単純な文字セット(Wikipedia base64)を持つbase64でエンコードされた文字列にコマンドを変換し、これらの文字をエスケープする必要はありません。それがもう一方の側にあると、それはデコードされ、bashインタプリタにパイプされます。

script.txtに次のように入れ、上記のあなたの例で、この作業をするために:この大きすぎないコマンドについては

file=$(hostname)_server-setup_$(date +%Y-%m-%d).tar.gz && cd /var && tar -zcvf $file ini | wc -l | xargs printf "Num files: %d, File: $file" 
関連する問題