单引号在单引号字符串中以bash转义

时间:2014-03-07 12:12:42

标签: bash shell

问题

我正在尝试自动创建kickstart文件,而我用来解析它的工具需要将kickstart作为单引号中的字符串提供。

除了使用awk的postinstall脚本外,其中大部分都没问题,因此单引号内有单引号。

我看了一些其他的帖子,并试图逃避字符串,但无济于事。

我明显误解了逃避的一些基本原则。

代码

DATA='
GATEWAY=$(localcli network ip route ipv4 list | grep default | awk \'{print $3}\')
'
echo ${DATA}

所需的输出

这是我想看到的文字输出字符串。

GATEWAY=$(localcli network ip route ipv4 list | grep default | awk '{print $3}')

非常感谢任何帮助!

由于

马特

3 个答案:

答案 0 :(得分:2)

由于您无法在单引号字符串中转义字符,因此您必须在其外部进行转义:

~$ echo 'abc'\''cde'
abc'cde

或者,使用双引号字符串(需要转义$

DATA="
GATEWAY=\$(localcli network ip route ipv4 list | grep default | awk '{print \$3}')
"

答案 1 :(得分:1)

有一个鲜为人知的第三类引号 - $'...' - 可用于bash,您可以在其中转义单引号:

DATE=$'GATEWAY=$(...| awk \'/default/ {print $3}\')'

(这也说明了为什么经常不需要grep awk {。}}。

答案 2 :(得分:0)

如果必须DATA变量定义中使用单引号,则将awk替换为cut可能是一种解决方法。

e.g:

$ echo "first second third" > ex.txt
$ awk '{print $3}' ex.txt
third
$ cut -d" " -f3 ex.txt
third