How to treat a command output as text

You are attempting to execute the contents of $pvs_var as a command, rather than passing the string to awk.

To fix this, add an echo or printf in your if statement:

if [[ $(echo "$pvs_var" | awk '{ print $2 }') = vg_name ]]; then
    do something
fi

Get the output in JSON format, and then you'll be able to extract information in a more reliable way:

pv_info=$(pvs -o pv_all,vg_all --unit b --nosuffix --reportformat json)
sdb1_vg=$(
  printf '%s\n' "$pv_info" |
    jq -r '.report[].pv[]|select(.pv_name == "/dev/sdb1").vg_name'
)

if [ "$sdb1_vg" = vg_name ]; then...

Or use a proper programming language with a JSON library instead of a shell (ksh93 does have JSON support though in its upcoming version).

(you need LVM 2.02.158 (2016) or newer for --reportformat json).

If it's just that one query you want to do, pvs can also do all the work for you:

sdb1_vg=$(
  pvs -o vg_name -S pv_name=/dev/sdb1 --no-heading --config 'log{prefix=""}'
)

(you need LVM 2.02.107 (2014) or newer for -S).

Also remember to quote your variables and avoid echo.


If you want to compare the VG from the output, then it might be easier to pre-process that:

# if you still need it
pvs_var=$(pvs | grep "sdb1") 
vg_name=$(pvs | grep "sdb1" | awk '{print $2}')
if [ "$vg_name" = "vg_name" ]; then
  echo do something
fi

What you were doing with

$($pvs_var | awk '{ print $2 }')

was initiating a command substitution $( ... ) whose first command was $pvs_var. Bash dutifully substituted the value of the variable and then attempted to execute it. That's not what you wanted.

Another alternative would be to send the variable as a here-string to the awk command:

# ...
if [ $(awk '{print $2}' <<< "$pvs_var") = "vg_name" ]; then
# ...

Here, the command substitution is calling awk and passing it input on stdin -- the contents of the $pvs_var variable.