Bash
如何將命令輸出視為文本
我需要將命令輸出與字元串進行比較。這是場景:
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 語句中添加
echo
or :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
)。