Хотя это решение может выглядеть длиннее, на самом деле оно намного меньше кода и его легко тестировать. Частично проблема заключается в том, что вы начали с некачественным скриптом. Обычно конвейеры с несколькими командами awk
нуждаются в улучшении. Я не знаю, подходит ли следующее для вашей ситуации, но я надеюсь, что это поможет лучше понять один из способов решения этой проблемы.
Чтобы получить целочисленное значение из потока xml, вы можете использовать awk
следующим образом:
awk '
/<key>bootHow<\/key>/ {
getline
gsub("[^0-9]*integer[^0-9]*", "");
print;
}
'
/ bootHow <\ / key> /
адресует строку, которая будет изменена действиями в фигурных скобках {...}
. getline
считывает следующую строку ввода в $ 0. Следующая строка должна содержать целочисленный код. gsub
удаляет все нецифровые символы из строки. выведите
строку. awk
по умолчанию не печатает строки. Включив это в функцию и написав другую функцию для преобразования целочисленного значения в описание строки, мы можем придумать что-то вроде протестированного кода ниже.
Функция boothow
инкапсулирует ранее описанный сценарий awk
.
Функция dfstatus
считывает коды «bootHow» со стандартного ввода и выводит соответствующие строки состояния df на стандартный вывод.
Скрипт в настоящее время настроен для тестирования. Его запуск приведет к прохождению некоторых тестовых данных через процесс. Линия, вызывающая deepfreeze
, закомментирована:
#!/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
В следующей записи приведенный выше сценарий был сохранен как ./ myscript.sh
.
При запуске . ./myscript.sh
(обратите внимание на одинокий .
), ваша интерактивная оболочка читает и выполняет сценарий в текущем процессе оболочки . Функции будут существовать и доступны как команды в вашей текущей оболочке.
$ . ./myscript.sh
boot thawed for next x reboots
Теперь команды boothow
и dfstatus
и test_boothow
и deepfreeze_status
доступны в вашей текущей оболочке. Проверьте команду boothow
:
$ boothow
<key>bootHow</key>
<integer>2</integer>
2
$ printf '<key>bootHow</key>\n<integer>2</integer>\n' | boothow
2
Проверьте команду dfstatus
, включая код состояния выхода ( $?
):
$ 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
$
Поддержка IBM может быть самым официальным ответом, который вы можете получить; если не называть их, я бы сослался на Installing the Trusted Computing Base (TCB )в AIX 6.1 и 7.1 , где частично говорится:
TCB cannot be added or enabled on a system that has already been installed. It can only be chosen when AIX is first installed.
Учитывая, что одним из требований является выбор New and Complete Overwrite
в качестве метода установки, я бы предположил, что нет, это невозможно во время обновления.