コマンド出力を文字列と比較する必要があります。シナリオは次のとおりです。
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に文字列を渡すのではなく、コマンドで実行したいのです。
この問題を解決するには、echo
ifステートメントにまたはを追加してください。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ライブラリで適切なプログラミング言語を使用してください(ksh93
JSONは将来のバージョンでサポートされていますが)。
(LVM 2.02.158(2016)以降が必要です--reportformat json
。)
1つのクエリのみを実行する場合は、次のよう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 '{ $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"