LINUX.ORG.RU

Как сделать короче?

 


0

1

Ребята, подскажите плиз как сделать короче, мне для красоты нужно.

if [ $tunnel_last_state -eq 1 ] && [ $internet_last_state -eq 1  ]; 
then 
   echo none > /sys/class/leds/red/trigger
   echo default-on > /sys/class/leds/blue/trigger
fi
if [ $tunnel_last_state -eq 1 ] && [ $internet_last_state -eq 0  ]; 
then 
   echo default-on > /sys/class/leds/red/trigger
   echo none > /sys/class/leds/blue/trigger
fi
if [ $tunnel_last_state -eq 0 ] && [ $internet_last_state -eq 1  ]; 
then 
   echo none > /sys/class/leds/red/trigger
   echo timer > /sys/class/leds/blue/trigger
fi
if [ $tunnel_last_state -eq 0 ] && [ $internet_last_state -eq 0  ]; 
then
   echo timer > /sys/class/leds/red/trigger
   echo none > /sys/class/leds/blue/trigger
fi

Спасибо!

Первое, что приходит в голову: [code]set_leds() { echo «$1» > /sys/class/leds/red/trigger echo «$2» > /sys/class/leds/blue/trigger }

if [ $tunnel_last_state -eq 1 ]; then if [ $internet_last_state -eq 1 ]; then set_leds none default-on else set_leds default-on none fi else if [ $internet_last_state -eq 1 ]; then set_leds none timer else set_leds timer none fi [/code]

anonymous
()

Первое, что приходит в голову:

set_leds() {
    echo "$1" > /sys/class/leds/red/trigger
    echo "$2" > /sys/class/leds/blue/trigger
}

if [ $tunnel_last_state -eq 1 ]; then
    if [ $internet_last_state -eq 1  ]; then
        set_leds none default-on
    else
        set_leds default-on none
    fi
else
    if [ $internet_last_state -eq 1  ]; then
        set_leds none timer
    else
        set_leds timer none
fi
anonymous
()

Ну, например, можно перечислить состояния в таблице:

declare -A states
states=(
[0,0]="none default-on"
[1,0]="default-on none"
[0,1]="none timer"
[1,1]="timer none"
)
read red blue <<<${states["$tunnel_last_state,$internet_last_state"]}
echo $red > /sys/class/leds/red/trigger
echo $blue > /sys/class/leds/blue/trigger
legolegs ★★★★★
()

как сделать короче, мне для красоты нужно

И так достаточно коротко. Вот если бы вариантов было больше, то можно было бы заморочиться на массив с вариантами.

Разве что вот это

   echo timer > /sys/class/leds/red/trigger
   echo none > /sys/class/leds/blue/trigger

вынеси в функцию (как советует анонимус)

setleds() {
    echo "$1" > /sys/class/leds/red/trigger
    echo "$2" > /sys/class/leds/blue/trigger
}

и тогда

[ $tunnel_last_state -eq 1 ] && [ $internet_last_state -eq 1  ] && setleds none default-on
[ $tunnel_last_state -eq 1 ] && [ $internet_last_state -eq 0  ] && setleds default-on none
[ $tunnel_last_state -eq 0 ] && [ $internet_last_state -eq 1  ] && setleds none timer
[ $tunnel_last_state -eq 0 ] && [ $internet_last_state -eq 0  ] && setleds timer none

no-such-file ★★★★★
()
Ответ на: комментарий от legolegs

Спасибо, выглядит - люкс, проверить теперь смогу только завтра вечерком.

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

и работает

Работает не совсем так, как было. Что если tunnel_last_state или internet_last_state не равны 0 или 1? Нужно дополнительно проверять и получаться уже не короче.

no-such-file ★★★★★
()
Ответ на: комментарий от adminlinwin

Ну ты всё равно добавь проверку

[ $red ] && [ $blue ] && (echo $red > /sys/class/leds/red/trigger; echo $blue > /sys/class/leds/blue/trigger)

заведомо либо 0 либо 1

Все так говорят, а потом херак, и ракета на старте взрывается.

no-such-file ★★★★★
()
Ответ на: комментарий от legolegs

доработка на случай если в tunnel_last_state и internet_last_state чт-то кроме 0 и 1:

declare -A states
states=(
[0,0]="none default-on"
[1,0]="default-on none"
[0,1]="none timer"
[1,1]="timer none"
)
read red blue <<<"${states["$tunnel_last_state,$internet_last_state"]:-none none}"
echo $red > /sys/class/leds/red/trigger
echo $blue > /sys/class/leds/blue/trigger
legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Как бы не оказалось, что это OpenWrt, судя по лампочкам и одиночным [ ], то есть dash.

leds_tun_0=timer
leds_tun_1=default-on
leds_inet_0=red
leds_inet_1=blue

if [ $tunnel_last_state -le 1 -a $internet_last_state -le 1  ]; then
        eval echo \$leds_tun_$tunnel_last_state \> /sys/class/leds/\$leds_inet_$internet_last_state/trigger
        eval echo none \> /sys/class/leds/\$leds_inet_$((internet_last_state^1))/trigger
fi
vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от no-such-file

На 16 букв меньше )

[[ $tunnel_last_state != 0 && $internet_last_state != 0 ]] && setleds none default-on
[[ $tunnel_last_state != 0 && $internet_last_state == 0 ]] && setleds default-on none
[[ $tunnel_last_state == 0 && $internet_last_state != 0 ]] && setleds none timer
[[ $tunnel_last_state == 0 && $internet_last_state == 0 ]] && setleds timer none
Deleted
()
Ответ на: комментарий от Deleted

Вот ещё проще:

case $tunnel_last_state.$internet_last_state in
 1.1) setleds none default-on;;
 1.0) setleds default-on none;;
 0.1) setleds none timer;;
 0.0) setleds timer none;;
esac
NeXTSTEP ★★
()
Ответ на: комментарий от Deleted

На 16 букв меньше )

Если сравниваете строки, то вместо $internet_last_state != 0 тут привильнее $internet_last_state = 1, это точно по ТЗ ТС-а, когда не [0,1] - ничего не делать, заодно даже круче, так как не сломается для internet_last_state=*

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

Да, это OpenWrt. С учётом замечаний, взял такой вариант :

set_leds() {
    echo "$1" > /sys/class/leds/red/trigger
    echo "$2" > /sys/class/leds/blue/trigger
}
[[ $tunnel_last_state == 1 && $internet_last_state == 1 ]] && set_leds none default-on
[[ $tunnel_last_state == 1 && $internet_last_state == 0 ]] && set_leds default-on none
[[ $tunnel_last_state == 0 && $internet_last_state == 1 ]] && set_leds none timer
[[ $tunnel_last_state == 0 && $internet_last_state == 0 ]] && set_leds timer none
anonymous, no-such-file, legolegs, vodz, erthink, NeXTSTEP
Спасибо ребята, помолюсь за вас на вечерней молитве.

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

Да, это OpenWrt.

Тогда не юзайте [[ ]] и ==, так как там это alias на [ ] и = и ничего другого не даёт, только смущает всех.

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