我有一个我在这里简化的脚本:
#!/bin/bash
# test.sh
set -u
### test-script ###
cat <<SCRIPT > ~/test-file-output
#!/bin/bash
set -e
usage() {
cat <<EOF
Does a thing
EOF
}
for opt in "$@"; do
case $opt in
-h|--help)
usage
exit 0
;;
*)
echo "Invalid option: $opt" >&2
usage
exit 1
;;
esac
done
SCRIPT
chmod +x ~/test-file-output
并且因为父脚本有set -u
它opt
在heredoc的子脚本中捕获var;子脚本设置opt
为 的值$@
。
有没有办法让它忽略heredoc中的所有变量和文本,因为它不是父脚本本身的一部分?我认为它会将heredoc视为一个巨大的字符串,而不是根据脚本语法对其进行解析。
heredoc 是一个巨大的字符串,但如果终止符字符串(
SCRIPT
在 your 中<< SCRIPT
)没有被引用,它就像一个双引号字符串,所以任何变量都会被扩展。如果终止符的任何部分在重定向中被引用(例如<< "SCRIPT"
),那么它就像一个单引号字符串,所以没有变量扩展。考虑这个脚本:
第一个
EOF
没有被引用,所以$var
展开。第二个是,所以字符串将cat
包含一个文字$var
。