繁体   English   中英

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

[英]Escaping dollar sign when echo write to file in CentOS linux bash script

我正在处理需要在此位置创建文件的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

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

在此输入图像描述

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

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

有任何想法吗?

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

cat >file <<EOL
$my_var
EOL

也就是说,按原样使用变量,而不必转义$

而不是

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

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

来自man bash

这里的文件

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

here-documents的格式是:

  <<[-]word here-document delimiter 

不对字执行参数扩展,命令替换,算术扩展或路径名扩展。 如果引用单词中的任何字符,则分隔符是单词上的引号删除的结果,并且不会展开here-document中的行。 如果word不加引号,则here-document的所有行都要进行参数扩展,命令替换和算术扩展 在后一种情况下,字符序列\\被忽略,\\必须用于引用字符\\,$和`。

看一个例子:

$ 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

让我们来运行它:

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

有一个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中的行。

只需将该字符串包装成单引号即可

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM