Try doing this :
$ arrayA=(1 2 3)
$ x=A
$ var=array$x[@]
$ echo ${!var}
1 2 3
NOTE
- from
man bash
(parameter expansion) :
${parameter}
The value of parameter is substituted.
The braces are required when parameter is a positional parameter with
more than one
digit, or when parameter is followed by a character which
is not to be interpreted as part of its name.
* If the first character of parameter is an exclamation point (!), a level of variable indirection is introduced. Bash uses the
value of the variable formed from the rest of parameter as the
name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than the value
of parameter itself. This is known as indirect expansion.
* The exceptions to this are the expansions of ${!prefix*} and ${!name[@]} described below. The exclamation point must immediately
follow the left brace in order to introduce indirection.
Change this line:
if [[ "$TEST" == "ON Master" ]];
To this:
if [ "$TEST" == "ON Master" ];
Details
The issue is the use of [[ .. ]]
. The output is showing you the difference. Your value that you're getting for $STATUS
is not simply "On Master". It most likely contains other characters, that are most likely not printable so are not being seen.
[[ .. ]]
++ echo On Master
+ TEST='On Master'
+ [[ On Master == \O\N\ \M\a\s\t\e\r ]]
[ .. ]
++ echo On Master
+ TEST='On Master'
+ '[' 'On Master' == 'ON Master' ']'
The use of double square brackets ([[ .. ]]
) is discussed here on the TLDP Advanced Bash Scripting pages.
echo $STATUS
This line seems a little suspicious to me as well. I'd protect the contents of $STATUS
by wrapping it in double quotes as well.
TEST=`echo "$STATUS"`
Also I'd drop the back ticks ( `...` ) and use the $( ... )
notation instead for executing this command. This change is just a best practice and isn't part of your issue though.
TEST=$(echo "$STATUS")
Control characters in output (^[[92mON^[[0m Master)
Given you're seeing these control characters in your output (^[[92m
& ^[[0m
) I'm suspicious that the grep
command is introducing these into your output in the pipe. It may be that grep
is aliases to always include the --color
switch, I'd temporarily try calling the executable directly, and by pass any aliases that may be there. Just change the grep
to this, /bin/grep
.
The presence of these is what we suspected and is why the text was wrapping when you echo
the variable $STATUS
. These characters are unprintable, and change the color of the terminal to highlight matches that grep
has found.
The presence of these also explains why the =~
operator didn't match too. You were trying to match 'On Master'
with '^[[92mON^[[0m Master'
.
Lastly the colored output with the control characters may be coming from another tool before the grep
. I would need to see the actual output from /root/setup_ha
to confirm this, but I would be suspicious of that tool as well in producing these characters in the pipe stream.
Stripping the control characters
I found this U&L Q&A titled: Program that passes STDIN to STDOUT with color codes stripped?.
Use either of these methods to get rid of the control characters.
Perl
$ cmd-with-colored-output | perl -pe 's/\e\[?.*?[\@-~]//g'
Sed
$ cmd-with-colored-output | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
Best Answer
The syntax
str^^
which you are trying is available from Bash 4.0 and above. Perhaps yours is an older version (or you ran the script withsh
explicitly):Try this: