我正在处理需要在此位置创建文件的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 - 未找到
有什么想法吗?
答案 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/'