LINUX.ORG.RU

Без 1if-1else, чем 1&&-1|| плохо?

 , ,


0

5

Собственно вопрос, конечно же не ко все конструкциям, а к простым, где один if и один else

В качестве примера вот, для переменной там-и-там:

TP="`synclient -l | grep TouchpadOff | awk {'print $3'}`"

if	[ "$TP" == "0" ]; then
 synclient TouchpadOff=1
elif	[ "$TP" == "1" ]; then
 synclient TouchpadOff=0
fi
[ "$TP" == "0" ] && synclient TouchpadOff=1 || synclient TouchpadOff=0

пока что где данное я прописывал, везде срабтывало, где может быть «подводный камень» и может знаете, где не сработает?

★★★★★

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

ИМХО, ничем не хуже, иногда даже легче читается. Использую.
Подписался.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 3)

P. S. Рекомендую [[ ]] вместо [ ]

Kroz ★★★★★
()

Тем что $TP может оказаться чем угодно, а отработает как с 1.

anonymous
()

Ничего плохого в конструкции .. && .. || .. нет, кроме того, что в данном случае можно обойтись без нее.

synclient TouchpadOff=$(synclient | grep -ce 'TouchpadOff.*= 0')

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

Спасибо, для данного случая учту

NK ★★★★★
() автор топика

Странно задавать вопрос «чем плоха такая-то синтаксическая конструкция». Ничем сами по себе не плохи ни ... && ... || ..., ни if ...; then ...; else ...; fi. Это разные конструкции, с *разной* логикой.

Единственная проблема — если логика if ...; then ...; else ...; fi обычно понятна всем, то что делает ... && ... || ..., некоторые не понимают. Поэтому понятности ради ее иногда советуют избегать.

Что до вашего частного случая, то он в чистом виде для case ...; in ...; esac:

while IFS=' =' read param value; do
    [[ $param == 'TouchpadOff' ]] && {
        case "$value" in
            0) newstate=1;;
            1) newstate=0;;
            2) newstate=0;;
        esac
        synclient "TouchpadOff=$newstate"
    }
done < \
     <(synclient -l)
Zmicier ★★★★★
()

Без 1if-1else, чем 1&&-1|| плохо?

Неравнозначная замена.
При определённых обстоятельствах могут выполниться оба условия:

$ true && { echo $?; false; } || { echo $?; }
0
1

ArcFi
()

Это к теме не относится, но возьми на заметку, если ты используешь awk, то grep уже лишний. И с кавычками у тебя совсем беда...

awk '/TouchpadOff/ { print $3 }'
surefire ★★★
()

где может быть «подводный камень»

если «synclient TouchpadOff=1» отработает с ошибкой, очевидно же (=> лучше засунуть в переменную и общий вызов)

anonymous
()
TP=$(synclient -l | awk '/TouchpadOff/ {print $3; exit}')

case $TP in 0|1) ;; *) exit 1; esac
synclient $(( 1 - TP ))
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.