2017-04-23 117 views
0

我需要在一個變量中轉義單引號。在shell腳本中轉​​義單引號

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'" 

更新

現在已經想出了這一點,但隨後$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

什麼是期望的輸出和你現在得到的輸出是什麼? $文件的價值是什麼? – 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

對於這個沒有太大的命令,我不會過分複雜化,並堅持原來的雙引號,和逃避只是$這不應該在本地擴大。

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

當通過SSH發送了一個複雜的命令(使用引號,美元符號,分號),那麼我更喜歡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腳本的命令。

這確實需要一個額外的文件,但不必轉義引號或其他特殊字符,這使得我認爲這是一個更好的解決方案。

這也適用於創建功能。

它的工作方式是將命令轉換成base64編碼的字符串,它具有更簡單的字符集(Wikipedia 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"