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

Lat*_*san 4 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
Run Code Online (Sandbox Code Playgroud)

所以,我尝试这样做:

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
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

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

有任何想法吗?

fed*_*qui 5

原则上,使用语法就足够了

cat >file <<EOL
$my_var
EOL
Run Code Online (Sandbox Code Playgroud)

也就是说,按原样使用 var,而不进行转义$

所以而不是

baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
                                         ^            ^
Run Code Online (Sandbox Code Playgroud)

baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
Run Code Online (Sandbox Code Playgroud)

man bash

这里的文件

这种类型的重定向指示 shell 从当前源读取输入,直到看到仅包含分隔符(没有尾随空格)的行。到该点读取的所有行都将用作命令的标准输入。

这里文档的格式是:

      <<[-]word
              here-document
      delimiter
Run Code Online (Sandbox Code Playgroud)

不对 word 执行任何参数扩展、命令替换、算术扩展或路径名扩展。如果word中的任何字符被引用,则分隔符是word删除引号的结果,并且此处文档中的行不会被扩展。 如果 word 不加引号,则此处文档的所有行都将进行参数扩展、命令替换和算术扩展。在后一种情况下,字符序列 \ 被忽略,并且必须使用 \ 来引用字符 \、$ 和 `。

看一个例子:

$ 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
Run Code Online (Sandbox Code Playgroud)

让我们运行它:

$ bash a.sh
hello
hello              <-- it expands when unquoted
double quotes
hello
$r                 <-- it does not expand with "EOL"
single quotes
hello
$r                 <-- it does not expand with 'EOL'
Run Code Online (Sandbox Code Playgroud)