J. Jesper
J. Jesper

Reputation: 137

Put quotation mark around variable

I want to put quotation marks around my variable if it's not empty. So I got this in a for loop and want an else statement that put $var in quotation marks if I want to Echo it out later on. How goes the syntax?

for var in var1 var2 var3 var4; do
    eval 'val=$'"$var"
        if [ -z "$val" ]; then
            eval "${var}=null"
        fi
done

Upvotes: 1

Views: 91

Answers (1)

chepner
chepner

Reputation: 531135

You don't need eval here at all. Instead, use indirect parameter expansion and the := parameter expansion operator.

# Works in 4.4, but not in earlier versions
for var in var1 var2 var3 var4; do
    : ${!var:=null}
done

However, I'd find a list of repeated assignments easier to read and maintain (as well as being POSIX-compliant).

: ${var1:=null}
: ${var2:=null}
: ${var3:=null}
: ${var4:=null}

Having forgotten about the quotes, I'd fall back to using printf to handle the dynamic assignments.

for var in var1 var2 var3 var4; do
  oldVal="${!var}"
  if [ -z "$oldVal" ]; then
    newVal=null
  else
    newVal=\"$oldVal\"
  fi
  printf -v "$var" '%s' "$newVal"
done

printf -v is safer than eval, but it's a bash extension. Continue using eval "$var=..." (with all the dangers that entails) if you need POSIX compatibility.

Upvotes: 1

Related Questions