Eu preciso comparar uma saída de comando com uma string. Este é o cenário:
pvs_var=$(pvs | grep "sdb1")
então pvs var é: /dev/sdb1 vg_name lvm2 a-- 100.00g 0
if [[ $($pvs_var | awk '{ print $2 }') = vg_name ]]; then
do something
fi
O problema é que a saída da instrução if é
-bash: /dev/sdb1: Permission denied
Não entendo esse comportamento. obrigada
Você está tentando executar o conteúdo de
$pvs_var
como um comando, em vez de passar a string para awk.Para corrigir isso, adicione um
echo
ouprintf
em sua instrução if:Obtenha a saída no formato JSON e, em seguida, você poderá extrair informações de maneira mais confiável:
Ou use uma linguagem de programação adequada com uma biblioteca JSON em vez de um shell (
ksh93
tem suporte a JSON em sua próxima versão).(você precisa do LVM 2.02.158 (2016) ou mais recente para
--reportformat json
).Se for apenas uma consulta que você deseja fazer,
pvs
também pode fazer todo o trabalho para você:(você precisa do LVM 2.02.107 (2014) ou mais recente para
-S
).Lembre-se também de citar suas variáveis e evitar
echo
.Se você quiser comparar o VG da saída, pode ser mais fácil pré-processar isso:
O que você estava fazendo com
estava iniciando uma substituição de comando
$( ... )
cujo primeiro comando era$pvs_var
. Bash obedientemente substituiu o valor da variável e então tentou executá-la. Não é isso que você queria.Outra alternativa seria enviar a variável como uma string here para o comando awk:
Aqui, a substituição do comando está chamando awk e passando a entrada em stdin -- o conteúdo da
$pvs_var
variável.Você pode tentar apenas com awk :