2017-04-23 86 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"