我在这里简化了一个脚本:
#!/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视为一个巨大的字符串,而不是根据脚本语法解析它。
答案1
Heredoc 是一个巨大的字符串,但如果终止符字符串(SCRIPT
在你的<< SCRIPT
)没有被引用,它的作用就像一个双引号字符串,因此任何变量都会被扩展。如果终止符的任何部分在重定向中被引用(例如<< "SCRIPT"
),那么它的作用就像一个单引号字符串,因此没有变量扩展。
考虑这个脚本:
$ cat heredoc.sh
#!/bin/bash
var=xyz
cat <<EOF
var=$var
EOF
cat <<'EOF'
var=$var
EOF
$ ./heredoc.sh
var=xyz
var=$var
第一个EOF
未引用,因此$var
展开。第二个是,所以字符串将cat
包含一个文字$var
。