| 1 | #!/usr/bin/env bash
|
| 2 | #
|
| 3 | # Usage:
|
| 4 | # ./09-here-doc.sh <function name>
|
| 5 |
|
| 6 | foo=bar
|
| 7 |
|
| 8 | cat <<< 'here string'
|
| 9 | echo
|
| 10 |
|
| 11 | # var interpolation
|
| 12 | cat <<EOF
|
| 13 | plain EOF terminator: $foo
|
| 14 | EOF
|
| 15 |
|
| 16 | echo
|
| 17 |
|
| 18 | # no var interpolation for any quoted delimiter
|
| 19 | cat <<'EOF'
|
| 20 | single quoted: $foo
|
| 21 | EOF
|
| 22 | cat <<"EOF"
|
| 23 | double-quoted: $foo
|
| 24 | EOF
|
| 25 | cat <<\EOF
|
| 26 | E escaped: $foo
|
| 27 | EOF
|
| 28 | cat <<EO\F
|
| 29 | F escaped: $foo
|
| 30 | EOF
|
| 31 |
|
| 32 | echo
|
| 33 |
|
| 34 | # Strip leading tabs
|
| 35 | cat <<-EOF
|
| 36 | one tab then foo: $foo
|
| 37 | EOF
|
| 38 |
|
| 39 | cat <<-EOF
|
| 40 | two tabs then foo: $foo
|
| 41 | EOF
|
| 42 |
|
| 43 | cat <<-EOF
|
| 44 | two spaces then a tab: $foo
|
| 45 | EOF
|
| 46 |
|
| 47 | # Strip leading and no interpolation
|
| 48 | cat <<-\EOF
|
| 49 | one tab and no interpolation: $foo
|
| 50 | EOF
|
| 51 |
|
| 52 | echo
|
| 53 |
|
| 54 | # output is bar and then foo
|
| 55 | cat <<EOF; echo 'command on same physical line as here doc'
|
| 56 | HERE CONTENTS
|
| 57 | EOF
|
| 58 |
|
| 59 | echo
|
| 60 |
|
| 61 | # Line continuation is ALLOWED in command before here doc.
|
| 62 | cat <<EOF\
|
| 63 | ; echo 'command on same logical line as here delimiter, after line continuation'
|
| 64 | HERE CONTENTS
|
| 65 | EOF
|
| 66 |
|
| 67 | echo
|
| 68 |
|
| 69 | cat <<EOF | tac; echo PIPE ON SAME LINE
|
| 70 | PIPE 1
|
| 71 | PIPE 2
|
| 72 | EOF
|
| 73 | echo
|
| 74 |
|
| 75 | cat <<EOF |
|
| 76 | PIPE 1
|
| 77 | PIPE 2
|
| 78 | EOF
|
| 79 | tac; echo PIPE ON DIFFERENT LINE
|
| 80 | echo
|
| 81 |
|
| 82 | tac <<EOF1 && tac <<EOF2
|
| 83 | PIPE A1
|
| 84 | PIPE A2
|
| 85 | EOF1
|
| 86 | PIPE B1
|
| 87 | PIPE B2
|
| 88 | EOF2
|
| 89 | echo
|
| 90 |
|
| 91 | cat <<EOF && echo '&&'
|
| 92 | Here doc in first part of &&
|
| 93 | EOF
|
| 94 | echo
|
| 95 |
|
| 96 | if cat <<EOF; then
|
| 97 | here doc in IF CONDITION
|
| 98 | EOF
|
| 99 | echo THEN executed
|
| 100 | fi
|
| 101 | echo
|
| 102 |
|
| 103 | { cat <<EOF; }; echo BLOCK
|
| 104 | here doc in BLOCK
|
| 105 | EOF
|
| 106 | echo
|
| 107 |
|
| 108 | ( cat <<EOF ); echo SUBSHELL
|
| 109 | here doc in SUBSHELL
|
| 110 | EOF
|
| 111 | echo
|
| 112 |
|
| 113 | myfunc() {
|
| 114 | cat <<EOF; echo in function
|
| 115 | here doc in FUNCTION
|
| 116 | EOF
|
| 117 | }
|
| 118 | myfunc
|
| 119 | echo
|
| 120 |
|
| 121 | case x in
|
| 122 | x) cat <<EOF; echo CASE
|
| 123 | here doc in CASE
|
| 124 | EOF
|
| 125 | ;;
|
| 126 | esac
|
| 127 | echo
|
| 128 |
|
| 129 | while read line; do
|
| 130 | echo == ${line} ==
|
| 131 | done <<EOF
|
| 132 | while 1
|
| 133 | while 2
|
| 134 | EOF
|
| 135 | echo
|
| 136 |
|
| 137 | # NOTE: bash gives a spurious warning here, but executes it correctly:
|
| 138 | # tests/09-here-doc.sh: line 131: warning: here-document at line 129 delimited
|
| 139 | # by end-of-file (wanted `EOF')
|
| 140 | #
|
| 141 | # Should be EOF\n) though.
|
| 142 |
|
| 143 | for x in 1 2 $(cat <<EOF
|
| 144 | THREE
|
| 145 | EOF
|
| 146 | ); do
|
| 147 | echo for word $x
|
| 148 | done
|
| 149 | echo
|
| 150 |
|
| 151 | if cat <<EOF1; then echo THEN; cat <<EOF2; fi
|
| 152 | here doc 1
|
| 153 | EOF1
|
| 154 | here doc 2
|
| 155 | EOF2
|
| 156 | echo
|
| 157 |
|
| 158 | # NESTING
|
| 159 | if cat <<EOF1 && cat <<EOF2; then echo THEN; cat <<EOF3; fi
|
| 160 | here doc 1
|
| 161 | EOF1
|
| 162 | here doc 2
|
| 163 | EOF2
|
| 164 | here doc 3
|
| 165 | EOF3
|
| 166 | echo
|
| 167 |
|
| 168 | # Here doc within here doc
|
| 169 | cat <<EOF
|
| 170 | one
|
| 171 | two
|
| 172 | echo $(cat <<EOF2
|
| 173 | INNER
|
| 174 | EOF2
|
| 175 | )
|
| 176 | three
|
| 177 | four
|
| 178 | EOF
|
| 179 | echo
|
| 180 |
|
| 181 | # COMPOUND here docs mixed with individual here docs
|
| 182 | # This shows it has to be a depth first search, but POST ORDER TRAVERSAL.
|
| 183 | while cat <<EOF1; read line; do cat <<EOF2; echo "read line: '$line'"; done <<EOF3
|
| 184 | condition here doc
|
| 185 | EOF1
|
| 186 | body here doc
|
| 187 | EOF2
|
| 188 | while loop here doc 1
|
| 189 | while loop here doc 2
|
| 190 | EOF3
|
| 191 |
|
| 192 | echo == DONE HERE DOC TESTS ==
|