Вот альтернатива использованию цикла for, если то, что вам нужно сделать, простое (и не требует установки переменных в основной оболочке и т. Д.).
Вы можете использовать find
с -exec
и использовать -maxdepth 1
, чтобы избежать повторного перехода в подкаталог.
[ -n "$1" ] && find "$dir" -type f -mindepth 1 -maxdepth 1 -exec "$@" "{}" \;
[-n "$ 1"]
используется, чтобы избежать выполнения всех файлов в каталоге, когда скрипту не передаются аргументы.
Не очень изящно, но если хотите, можете просто использовать awk, изменив свой последний строковый скрипт:
echo $output1 | grep battery.charge | awk {'print $2'}
И если вы хотите сохранить его как переменную:
output2=$(echo $output1 | grep battery.charge | awk {'print $2'})
Просто назначьте переменный
BCHRG="$( upsc ups@localhost | grep battery.charge | awk {'print $2'} )"
Как одна строка без промежуточной переменной и без grep
:
output="$( upsc ups@localhost | awk '/battery\.charge/ {print $2}'
Ваш вопрос касается только получения одной переменной, но один из подходов заключается в том, чтобы прогнать весь вывод upsc
в среду bash
и выбрать оттуда нужное вам значение. Вот так:
upsc_parser()
{
local upsc_var
local upsc_val
while read
do
upsc_var="${REPLY%: *}"
upsc_val="${REPLY#${upsc_var}: }"
upsc_var="${upsc_var//./_}"
upsc_val="${upsc_val//[\"\'\\]/}"
echo "upsc_${upsc_var}=\"${upsc_val}\""
done
}
eval $(upsc | upsc_parser)
echo $upsc_battery_charge
Это позволяет получить нужное значение и не требует много дополнительной работы, если вы позже решите, что вам нужно другое значение.