当echo写入CentOS linux bash脚本中的文件时,转义美元符号

时间:2015-12-30 23:06:31

标签: linux bash nginx heredoc

我正在处理需要在此位置创建文件的bash脚本:

/etc/yum.repos.d/nginx.repo

具有以下内容:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

所以,我试过这样做:

cat >/etc/yum.repos.d/nginx.repo <<EOL
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=0
enabled=1
EOL

当我检查文件的内容时,我看到以下内容:

enter image description here

如您所见,美元符号未被转义,因此该变量被评估为null /空字符串,并且内容看起来不正确。因为,当我尝试安装nginx时,我收到此错误:

  

http://nginx.org/packages/centos///repodata/repomd.xml:[Errno 14] HTTP错误404 - 未找到

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

原则上,使用语法

就足够了
$stmt = $link->prepare("SELECT * FROM tables WHERE ip = :ip");
$stmt->bindParam(':ip', $ip);
$stmt->execute();

if ($stmt->fetch()) {
    $delete = $link->prepare("DELETE FROM tables WHERE ip = :ip");
    $delete->bindParam(':ip', $ip);
    $delete->execute();
}

也就是说,按原样使用变量,而不必转义cat >file <<EOL $my_var EOL

所以而不是

$

baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
                                         ^            ^

来自baseurl=http://nginx.org/packages/centos/$releasever/$basearch/

  

此处文件

     

这种重定向指示shell从中读取输入   当前源直到一行只包含分隔符(没有   可见尾随空白)。所有读到的那一行都是   然后用作命令的标准输入。

     

here-documents的格式为:

man bash
     

没有参数扩展,命令替换,算术扩展,   或者对word执行路径名扩展。如果单词中有任何字符   引用,分隔符是单词引用删除的结果,和   here-document中的行未展开。 如果是的话   如果没有引用,here-document的所有行都会受到参数的影响   扩展,命令替换和算术扩展。在里面   后一种情况,字符序列\被忽略,并且   必须用来引用字符\,$和`。

查看示例:

      <<[-]word
              here-document
      delimiter

让我们运行它:

$ cat a.sh
r="hello"
cat - <<EOL
hello
$r
EOL

echo "double quotes"
cat - <<"EOL"
hello
$r
EOL

echo "single quotes"
cat - <<'EOL'
hello
$r
EOL

答案 1 :(得分:3)

here-doc 通用语法可以防止内容扩展,就像在变量周围放置单引号一样:

cat<<'EOF' 

cat<<'EOF' > /path/to/file
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
EOF

来自

man bash | less +/here-doc
  

如果引用单词中的任何字符,则分隔符是单词上引号删除的结果,而here-document中的行不会被展开。

答案 2 :(得分:2)

将该字符串包装成单引号

baseurl='http://nginx.org/packages/centos/$releasever/$basearch/'

然后美元符号将被视为通常的角色。

[root@xxx ~]# cat test
baseurl='http://nginx.org/packages/centos/$releasever/$basearch/'