Bash

set -u 在 bash 腳本的 heredoc 中找到未設置的值

  • July 8, 2019

我有一個我在這裡簡化的腳本:

#!/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 -uopt在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

引用自:https://unix.stackexchange.com/questions/529017