在新机器上编写 bash 脚本,转义代码

在新机器上编写 bash 脚本,转义代码

某处可能存在这样的问题。但我没能轻易找到它。

基本上我想在一个新盒子上写一个 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'

相关内容