Bash尝试在heredoc中执行命令

5

我正在尝试编写一个简单的bash脚本,将多行输出打印到另一个文件中。我是通过 heredoc 格式实现的:

#!/bin/sh

echo "Hello!"
cat <<EOF > ~/Desktop/what.txt
a=`echo $1 | awk -F. '{print $NF}'`
b=`echo $2 | tr '[:upper:]' '[:lower:]'`
EOF

我原本期望在我的桌面上看到一个包含以下内容的文件:
a=`echo $1 | awk -F. '{print $NF}'`
b=`echo $2 | tr '[:upper:]' '[:lower:]'`

但是实际上,我看到的是这些内容出现在我的what.txt文件中:
a=
b=

不知何故,尽管它是heredoc的一部分,但bash仍在逐行执行它。我该如何防止这种情况,并将内容按原样打印到文件中?


2
<<EOF 替换为 <<'EOF' - Cyrus
嗯,问题解决了,谢谢。你能解释一下为什么这样做吗?并把它作为答案,这样我就可以接受了吗? - SexyBeast
这是 here document 的语法。随意接受 heemayl 的答案。 - Cyrus
如果我希望命令被视为文本,但是我仍然需要变量,怎么办? - Martijn Scheffer
1个回答

15

引用EOF以使bash按照字面意思接受输入:

cat <<'EOF' > what.txt
a=`echo $1 | awk -F. '{print $NF}'`
b=`echo $2 | tr '[:upper:]' '[:lower:]'`
EOF

使用$()进行命令替换,而不是老旧且有问题的``。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接