Bash
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
它opt
在heredoc的子腳本中擷取var;子腳本設置opt
為 的值$@
。有沒有辦法讓它忽略heredoc中的所有變數和文本,因為它不是父腳本本身的一部分?我認為它會將heredoc視為一個巨大的字元串,而不是根據腳本語法對其進行解析。
heredoc 是一個巨大的字元串,但如果終止符字元串(
SCRIPT
在 your 中<< 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
。