Я ищу компактную строку кода, которая дважды использует значение выражения в одном вложенном операторе
Вопросы:
-
Возможна ли эта компактная форма в bash?
Если да, нужно ли мне опасаться негативных побочных эффектов (неожиданных результатов)?
Вы, конечно, можете выполнить присвоение раньше:
$ local bus_connection="$(lsblk -dn -o TRAN /dev/sdd)"
$ test "$bus_connection" = "usb" || { echo "not usb"; exit 1 }
$ echo "$bus_connection"
usb
-> Работает!
Если переменная bus_connection нужна только в случае успеха, вы также можете сделать:
$ test "$(lsblk -dn -o TRAN /dev/$DEVICE)" = "usb" \
&& local bus_connection="usb" \
|| { echo "not usb"; exit 1 }
$ echo "$bus_connection"
usb
-> Тоже работает! (Не используйте 'local' в командной строке!)
В C (++) и некоторых других скомпилированных языках высокого уровня вы можете сделать это более компактным (предположим, что функция c '' lsblk '):
if( ( bus_connection = lsblk( ... ) ) == "usb" ) ; else {printf("not usb"); exit 1;}
В bash Я пробовал:
$ test $(bus_connection="$(lsblk -dn -o TRAN /dev/sdd)") = "usb" || echo "not usb"
bash: test: =: unary operator exspected.
not usb
-> Сообщение об ошибке и неправильный результат!
Я тестировал с целочисленным регистром и нашел:
$ sum=0
$ result=12
$ test $((sum=$sum+$result)) -gt 20 && echo "true"
$ test $((sum=$sum+$result)) -gt 20 && echo "true"
true
-> Работает! Отрицательные побочные эффекты?
Аналог:
$ test $((bus_connection="$(lsblk -dn -o TRAN /dev/sdd)")) = "usb" || echo "not usb"
not usb
-> Нет сообщения об ошибке, но неверный результат!
$ echo "$bus_connection"
0
-> Ах, очевидно, bash лечит переменная bus_connection теперь имеет целочисленный тип.
Есть предложения для строк?