如何将命令输出视为文本

如何将命令输出视为文本

我需要将命令输出与字符串进行比较。这是场景:

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 语句中添加echoor :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)。

还记得要引用你的变量避免echo

答案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"

相关内容