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.