LINUX.ORG.RU

Что можно улучшить в данном скрипте?

 , devel, ,


0

1

Шалом.

Сабж. Может что-то можно оптимизировать (для скорости работы, удобства чтения и ПРАВИЛЬНОСТИ)?

#!/bin/sh

# CPUs
getstat_core_temp_separator="/"
getstat_core_temp_suffix="°C"

# Battery
getstat_battery_state_charging="заряжается"
getstat_battery_state_discharging="разряжается"
getstat_battery_state_charged="заряжена"
getstat_battery_state_missing="отсутсвует"
getstat_battery_state_unknown="ошибка"


getstat_sysctl="sysctl -n"
getstat_arg_n="$#"

getstat_core_temperature() {
    getstat_core_n="`${getstat_sysctl} hw.ncpu`"
    while [ ! "$getstat_core_n" -eq "0" ] ; do
	getstat_core_n="$(( ${getstat_core_n} - 1 ))"
	getstat_core_temp="`${getstat_sysctl} dev.cpu.${getstat_core_n}.temperature`"
	getstat_core_temp="`printf "${getstat_core_temp}" | cut -d, -f1`"
	printf "${getstat_core_temp}${getstat_core_temp_suffix}"
	[ "$getstat_core_n" -ge "1" ] && printf "${getstat_core_temp_separator}"
    done
}

getstat_memory_total() {
    getstat_memory_page_size="`${getstat_sysctl} vm.stats.vm.v_page_size`"
    getstat_memory_page_count="`${getstat_sysctl} vm.stats.vm.v_page_count`"
    getstat_memory_total="$(( ${getstat_memory_page_count} * ${getstat_memory_page_size} / 1048576 ))"
    printf "${getstat_memory_total}"
}

getstat_memory_used() {
    getstat_memory_page_size="`${getstat_sysctl} vm.stats.vm.v_page_size`"
    getstat_memory_page_wire="`${getstat_sysctl} vm.stats.vm.v_wire_count`"
    getstat_memory_page_active="`${getstat_sysctl} vm.stats.vm.v_active_count`"
    getstat_memory_used="$(( (${getstat_memory_page_wire} + ${getstat_memory_page_active}) * \
${getstat_memory_page_size} / 1048576 ))"
    printf "${getstat_memory_used}"
}

getstat_memory_free() {
    getstat_memory_free="$(( `getstat_memory_total` - `getstat_memory_used` ))"
    printf "${getstat_memory_free}"
}

getstat_battery_state() {
    getstat_battery_state="`${getstat_sysctl} hw.acpi.battery.state`"
    if [ "$getstat_battery_state" -eq "2" ] ; then
	getstat_battery_state="${getstat_battery_state_charging:=charging}"
    elif [ "$getstat_battery_state" -eq "1" ] ; then
	getstat_battery_state="${getstat_battery_state_discharging:=discharging}"
    elif [ "$getstat_battery_state" -eq "0" ] ; then
	getstat_battery_state="${getstat_battery_state_charged:=charged}"
    elif [ "$getstat_battery_state" -eq "-1" ] ; then
	getstat_battery_state="${getstat_battery_state_missing:=missing}"
    else
	getstat_battery_state="${getstat_battery_state_unknown:=unknown}"
    fi
    printf "${getstat_battery_state}"
}

getstat_battery_life() {
    getstat_battery_life="`${getstat_sysctl} hw.acpi.battery.life`"
    printf "${getstat_battery_life}"
}

while [ "$getstat_arg_n" -ne "0" ] ; do
    getstat_arg_n="$(( ${getstat_arg_n} - 1 ))"
    case ${1} in
	-ct)	getstat_out="${getstat_out} `getstat_core_temperature`" ;;
	-mt)	getstat_out="${getstat_out} `getstat_memory_total`" ;;
	-mu)	getstat_out="${getstat_out} `getstat_memory_used`" ;;
	-mf)	getstat_out="${getstat_out} `getstat_memory_free`" ;;
	-bs)	getstat_out="${getstat_out} `getstat_battery_state`" ;;
	-bl)	getstat_out="${getstat_out} `getstat_battery_life`" ;;
	*)	getstat_out="${getstat_out} `printf "${1}"`" ;;
    esac
    shift
done

echo ${getstat_out}


// Это не конец, будет больше отдавать.

Интересует улучшение конструкции обработки параметров в первую очередь.

Заранее благодарю.

★★★★★

Последнее исправление: IPR (всего исправлений: 1)

Ответ на: комментарий от anonymous

Поэтому ОП его и не использует, да? Тупак на самом деле, башизмы быстрее и лучше работают. Да и удобно на самом деле.

Потому что у ОПа нет bash'а вообще. И ставить его я смысла не вижу. У других тоже может не быть.

IPR ★★★★★
() автор топика
Ответ на: комментарий от IPR

POSIX Shell есть везде

На винде нет.

Будет работать всегда

Не будет. Ибо писать на баше настолько же опасно, как и на сишке. Да и coreutils не везде одинаковые.

RazrFalcon ★★★★★
()
Ответ на: комментарий от anonymous

Абы да кабы. Задача в моём примере чёткая — написать олин единственный запрос. В различных веб-api и библиотеках я тоже алхимию юзаю, причём в одном месте вообще без орм (с пользовательскими запросами для источника данных в шаблонизаторе xlsx).

WitcherGeralt ★★
()
Ответ на: комментарий от IPR

Это не bash

И что? А мог бы быть и баш, вообще не принципиально. Срач в другом.

WitcherGeralt ★★
()
Ответ на: комментарий от anonymous

local

Ну так на то кол-во символов и распухнет.

IPR ★★★★★
() автор топика
Ответ на: комментарий от legolegs

В функции getstat_battery_state вместо уродливой цепочки if можно использовать ассоциативный массив

Я уже обосрался, добавив в теги bash. Прошу прощения. Это не bash.

IPR ★★★★★
() автор топика
Ответ на: комментарий от WitcherGeralt

Сам по себе bash — не самая лёгкая оболочка

Настолько ли большая разница, чтобы быть принципиальной?

Думаю, что если скрипт небольшой и без длинных циклов, то размер загружаемой оболочки важнее, чем скорость интерпретатора. А если он вызывается очень часто (например, раз в пару секунд по крону), то разница может оказаться принципиальной. Хотя, конечно, всё надо измерять. И если реально bash со скриптом не тормозят другие приложения, то да, не принципиально. Но в любом случае, если специфические возможности bash не используются или без них легко обойтись без ущерба для удобства программирования/читабельности/компактности/скорости, то зачем её использовать? К тому же bourne shell универсальнее bash'а.

aureliano15 ★★
()
Ответ на: комментарий от aureliano15

Но ведь скрипты не для скорости пишут, кому нужна скорость, тот пишет на условных сях.

без ущерба для удобства программирования/читабельности/компактности

Даже не знаю, но как-то сомневаюсь.

К тому же bourne shell универсальнее bash'а

Звучит не убедительно. Лично у меня нет ни одного устройства кроме iot-фигни с бизибоксом, где бы не было баша. Даже на единственном виндовом сервачке (виртуальном билдике) и то баш есть.

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от WitcherGeralt

Но ведь скрипты не для скорости пишут, кому нужна скорость, тот пишет на условных сях.

Есть ещё и скорость написания, когда скорость выполнения не критична. Но даже когда она не критична, это не всегда значит, что она совсем неважна.

без ущерба для удобства программирования/читабельности/компактности

Даже не знаю, но как-то сомневаюсь.

Ну взять скрипты тс'а — они не на баше, хотя на баше тоже заведутся. Он использует `команда` вместо $(команда). И какая разница? Имхо, ни удобству, ни читабельности, ни скорости это не мешает.

К тому же bourne shell универсальнее bash'а

Звучит не убедительно. Лично у меня нет ни одного устройства кроме iot-фигни с бизибоксом

Т. е. одно устройство всё-таки есть. И у тс'а тоже устройство (или комп) без баша, как он говорит.

aureliano15 ★★
()
Ответ на: комментарий от RazrFalcon

писать на баше настолько же опасно, как и на сишке

?

coreutils не везде одинаковые

?

Ты в какой параллельной вселенной живешь?

anonymous
()
Ответ на: комментарий от RazrFalcon

От анонима со stackoverflow ждать можно чего угодно, кроме чтения стандартов, это да

Deleted
()
Ответ на: комментарий от Deleted

Ну и #!/bin/sh не нужен, достаточно chmod +x - shell это интерпретатор по умолчанию(хотя трудно представляю себе систему, на которой бинарь shell был бы не /bin/sh)

может быть dash,bash,zsh и еще куча всего.

у меня вообще xonsh в роли дефолтного шела у пользователя.

ktk ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.