> Since those are not numeric, bash treats them as expressions to be > evaluated. You don't have to use the $ to obtain variable evaluation > when using [[ or [. You get:
c=1;a="c";b=2;[[ a -lt b ]]; echo $? 0 c=3;a="c";b=2;[[ a -lt b ]]; echo $? 1 I see. I was aware of explicit indirection as described in the man page section "Parameter Expansion", with the syntax ${!name}. I wasn't aware of the above implicit indirection with [[ expression ]]. But, for [ expression ], I have to use explicit indirection with ${!a} otherwise I get an error, "bash: [: a: integer expression expected". This brings up some interesting situations with indirection and declare: # f is assigned the value of z through implicit indirection unset z f;declare -i z=5;declare -i f="z";declare -p z f declare -i z="5" declare -i f="5" # f is assigned the default value of 0 when z is not defined # for implicit indirection unset z f;declare -i f="z";declare -p z f bash: declare: z: not found declare -i f="0" # f is assigned the default value of 0 when empty variable name # is used for implicit indirection unset z f;declare -i f="";declare -p z f bash: declare: z: not found declare -i f="0" # unset z f;declare -i f;echo $?;echo \"$f\";declare -p z f 0 "" bash: declare: z: not found bash: declare: f: not found It would be helpful if indirection was explained in the documentation for [[ expression ]], [ expression ], and declare. Thank you. Peg