0

I'm not a bash expert and can not really describe my problem. That's why I show you my script:

#!/bin/bash -x
bash -ex << TRY
  VAR1="123"
  echo "$VAR1"
TRY
echo "exit code: $?"

When I run the script, it produces the following output:

+ bash -ex
+ VAR1=123
+ echo ''

+ echo 'exit code: 0'
exit code: 0

My problem: Why is the variable VAR1 not assigned in echo command? I would expect the following output:

+ bash -ex
+ VAR1=123
+ echo ''
123
+ echo 'exit code: 0'
exit code: 0
hellomichibye
  • 4,112
  • 2
  • 23
  • 23
  • This isn't really exception handling. It's just a separate program that can abort early, and it only works if the script being passed to `bash` doesn't need to read from standard input at all. – chepner Aug 01 '17 at 12:05
  • that's all I need for my use case, thanks for clarification – hellomichibye Aug 02 '17 at 11:51

2 Answers2

1

That's because $VAR1 gets expanded even before going into the bash instance, by the current shell.

Quote TRY as below if you don't want the variables to be expanded from outside. (You can use either single or double quotes.)

bash -ex << "TRY"
  VAR1="123"
  echo "$VAR1"
TRY

From the Bash manual

3.6.6 Here Documents

This type of redirection instructs the shell to read input from the current source until a line containing only word (with no trailing blanks) is seen. All of the lines read up to that point are then used as the standard input (or file descriptor n if n is specified) for a command.

The format of here-documents is:

[n]<<[-]word here-document delimiter

No parameter and variable expansion, command substitution, arithmetic expansion, or filename expansion is performed on word. If any part of word is quoted, the delimiter is the result of quote removal on word, and the lines in the here-document are not expanded. If word is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion, the character sequence \newline is ignored, and ‘\’ must be used to quote the characters ‘\’, ‘$’, and ‘`’.

If the redirection operator is ‘<<-’, then all leading tab characters are stripped from input lines and the line containing delimiter. This allows here-documents within shell scripts to be indented in a natural fashion.

Anubis
  • 6,995
  • 14
  • 56
  • 87
1

Since your Try/Catch is a heredoc, the shell does variable expansion.
Try this:

#!/bin/bash -x
bash -ex << \TRY
  VAR1="123"
  echo "$VAR1"
TRY
echo "exit code: $?"

This can too be achieved by quoting the heredoc token. However, If you want variable substitution performed, don't quote it.

NullDev
  • 6,739
  • 4
  • 30
  • 54