명령 출력을 문자열과 비교해야 합니다. 시나리오는 다음과 같습니다.
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
.)
하나의 쿼리만 실행하려는 경우 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"