我需要将命令输出与字符串进行比较。这是场景:
pvs_var=$(pvs | grep "sdb1")
所以 pvs var 是: /dev/sdb1 vg_name lvm2 a-- 100.00g 0
if [[ $($pvs_var | awk '{ print $2 }') = vg_name ]]; then
do something
fi
问题是 if 语句的输出是
-bash: /dev/sdb1: Permission denied
我不明白这种行为。谢谢
答案1
您正在尝试将 的内容$pvs_var
作为命令执行,而不是将字符串传递给 awk。
要解决此问题,请在 if 语句中添加echo
or :printf
if [[ $(echo "$pvs_var" | awk '{ print $2 }') = vg_name ]]; then
do something
fi
答案2
获取 JSON 格式的输出,然后您将能够以更可靠的方式提取信息:
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...
或者使用带有 JSON 库的正确编程语言而不是 shell(ksh93
尽管在即将推出的版本中确实支持 JSON)。
(您需要 LVM 2.02.158 (2016) 或更高版本--reportformat json
)。
如果您只想执行一项查询,pvs
也可以为您完成所有工作:
sdb1_vg=$(
pvs -o vg_name -S pv_name=/dev/sdb1 --no-heading --config 'log{prefix=""}'
)
(您需要 LVM 2.02.107 (2014) 或更高版本-S
)。
答案3
如果您想比较输出中的 VG,那么预处理可能会更容易:
# 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
你正在做什么
$($pvs_var | awk '{ print $2 }')
正在启动命令替换,$( ... )
其第一个命令是$pvs_var
. Bash 忠实地替换了变量的值,然后尝试执行它。那不是你想要的。
另一种选择是将变量作为此处字符串发送到 awk 命令:
# ...
if [ $(awk '{print $2}' <<< "$pvs_var") = "vg_name" ]; then
# ...
这里,命令替换是调用 awk 并将其输入传递到 stdin——变量的内容$pvs_var
。
答案4
您只能尝试使用 awk :
pvs | awk -v search='vg_name' '/sdb1/&&$2==search{exit 1}' || echo "ok"