某处可能存在这样的问题。但我没能轻易找到它。
基本上我想在一个新盒子上写一个 bash 脚本。我以前使用过的脚本。
例子:
#!/bin/bash -ex
hi='hello world!'
echo $hi
我一直使用(用于多行输出)
cat > script.sh <<EOF
#!/bin/bash -ex
hi='hello world!'
echo $hi
EOF
但您可能已经注意到,这与 $hi 和其他符号存在问题。有没有好的方法可以做到这一点?提示与技巧?
答案1
您应该引用文件结束标记,否则变量扩展(或者更确切地说,以 , 开头的所有内容$
都将获取当前上下文。
比较:
hi=here
cat >file.sh <<EOF
#!/bin/sh
hi=there
echo $hi
EOF
sh file.sh
(输出here
)
hi=here
cat >file.sh <<\EOF
#!/bin/sh
hi=there
echo $hi
EOF
sh file.sh
输出there
hi=here
cat >file.sh <<'EOF'
#!/bin/sh
hi=there
echo $hi
EOF
sh file.sh
输出there
。
或者,您可以引用$
:
hi=here
cat >file.sh <<EOF
#!/bin/sh
hi=there
echo \$hi
EOF
sh file.sh
(输出there
)
当需要为各种目的生成略有不同的脚本时,这种最初令人惊讶的行为非常方便。
答案2
我想我可能已经明白了。仍然对其他人如何解决这个问题感兴趣:
cat > script.sh <<'EOF'
#!/bin/bash -ex
hi='hello world!'
echo $hi
EOF
需要注意的是,freebsd 似乎需要:
cat > script.sh <<'EOF'
#!/bin/bash -ex
hi='hello world!'
echo $hi
'EOF'