if ($answer_counter == 1): ?>
endif; ?>
Embora esta solução possa parecer mais longa, na verdade é muito menos código e facilmente testável. Parte do problema parece que você começou com um script de baixa qualidade. Normalmente, os pipelines com vários comandos awk
podem usar melhorias. Não sei se o seguinte é melhor para a sua situação, mas espero que dê mais informações sobre uma maneira de abordar esse problema.
Para obter o valor inteiro do fluxo xml, você pode usar awk
da seguinte forma:
awk '
/<key>bootHow<\/key>/ {
getline
gsub("[^0-9]*integer[^0-9]*", "");
print;
}
'
-
/<key>bootHow<\/key>/
endereça a linha que será modificada pelas ações dentro das chaves { ... }
.
-
getline
lê a próxima linha de entrada em $ 0. Esta próxima linha deve conter o código inteiro.
-
gsub
exclui todos os não dígitos da linha.
-
print
da linha. awk
não imprime linhas por padrão.
Incorporando isso em uma função, e escrevendo outra função para traduzir o valor inteiro na descrição da string, podemos criar algo como o código testado abaixo.
A função boothow
encapsula o script awk
descrito anteriormente.
A função dfstatus
lê os códigos "bootHow" da entrada padrão e imprime as seqüências de status df correspondentes na saída padrão.
O script está atualmente configurado para testes. A execução colocará alguns dados de teste no processo. A linha chamando deepfreeze
é comentada:
#!/bin/sh
deepfreeze_status() {
deepfreeze=/Library/Application\ Support/Faronics/Deep\ Freeze/deepfreeze
if [ ! -x "$deepfreeze" ]
then
status="DeepFreeze not installed"
else
status=$(
DFXPSWD=password "$deepfreeze" -u user -p status -x |
boothow |
dfstatus
)
fi
echo "<result>$status</result>"
}
test_boothow() {
# test boothow and dfstatus functions:
dfdata='
<integer>a</integer>
<key>other1</key>
<integer>b</integer>
<key>bootHow</key>
<integer>1</integer>
<key>other2</key>
<integer>c</integer>
'
echo "$dfdata" | boothow | dfstatus
}
boothow() {
awk '
/<key>bootHow<\/key>/ {
getline
gsub("[^0-9]*", "");
print;
}
'
}
dfstatus() {
while read bhow
do
case $bhow in
0) echo "frozen" ;;
1) echo "boot thawed for next x reboots" ;;
2) echo "boot thawed" ;;
*) echo "unknown status '$bhow'"; return 1 ;;
esac
done
}
test_boothow
#deepfreeze_status
Na transcrição a seguir, o script acima foi salvo como ./myscript.sh
.
Quando você executa . ./myscript.sh
(observe o lone .
), o seu shell interativo lê e executa o script, no seu processo shell atual . As funções existirão e estarão disponíveis como comandos no seu shell atual.
$ . ./myscript.sh
boot thawed for next x reboots
Agora, os comandos boothow
e dfstatus
e test_boothow
e deepfreeze_status
estão disponíveis no seu shell atual. Teste o comando boothow
:
$ boothow
<key>bootHow</key>
<integer>2</integer>
2
$ printf '<key>bootHow</key>\n<integer>2</integer>\n' | boothow
2
Teste o comando dfstatus
, incluindo o código de status de saída ( $?
):
$ dfstatus
0
frozen
1
boot thawed for next x reboots
2
boot thawed
3
unknown status '3'
$ echo $?
1
$
$ echo 1 | dfstatus
boot thawed for next x reboots
$ echo $?
0
$ echo 1 1 | dfstatus
unknown status '1 1'
$ echo $?
1
$