Bash

如何將命令輸出視為文本

  • June 4, 2019

我需要將命令輸出與字元串進行比較。這是場景:

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

我不明白這種行為。謝謝

您正在嘗試將 的內容$pvs_var作為命令執行,而不是將字元串傳遞給 awk。

要解決此問題,請在 if 語句中添加echoor :printf

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

獲取 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.

引用自:https://unix.stackexchange.com/questions/485181