set -u 在bash脚本中的heredoc中找到未设置的值

set -u 在bash脚本中的heredoc中找到未设置的值

我在这里简化了一个脚本:

#!/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它正在捕获optheredoc中子脚本中的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

相关内容