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 - 未找到
有任何想法吗?
原则上,使用语法就足够了
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 从当前源读取输入,直到看到仅包含分隔符(没有尾随空格)的行。到该点读取的所有行都将用作命令的标准输入。
这里文档的格式是:
Run Code Online (Sandbox Code Playgroud)<<[-]word here-document delimiter不对 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)
| 归档时间: |
|
| 查看次数: |
2266 次 |
| 最近记录: |