Bash Можно ли использовать тернарный оператор для задания значений нескольким переменным?

#bash #conditional-operator

Вопрос:

(псевдо) код для того, что я хочу сделать:

 n=100
desired=""
for i in {1..10} ; do
    (( $(numeric_command_output) < n ?
        set n to the output and desired to $i :
        keep n and desired unchanged )) ; done
 

Я знаю, как манипулировать одной переменной на основе условия с помощью тернарного оператора, но можно ли это сделать в bash?

Ответ №1:

Можно ли использовать тернарный оператор для задания значений нескольким переменным?

ДА.

но можно ли это сделать в bash?

ДА.

 (( ( tmp=$(numeric_command_output) ) < n ? (n=tmp, desired=$i) : 0 ))
 

или

 (( tmp=$(numeric_command_output, tmp < n ? (n=tmp, desired=$i) : 0 ))
 

Комментарии:

1. похвала! хотя, безусловно, есть гораздо более простые и читаемые способы сделать это, мне просто не терпелось посмотреть, можно ли это сделать. Я не знал об операторе списка , для арифметической оценки в bash. Спасибо!… только одно, является : 0 ли часть для обозначения арифметики false ?

2. the list , operator en.wikipedia.org/wiki/Comma_operator : 0 part to signify arithmetic false Нет, просто должно быть что-то после : . 0 возможно, это плохой выбор, потому что он ложный, set -e может выйти из сценария, было бы лучше поставить что-то положительное.

3. «было бы лучше положить что-то положительное». или, в данном случае continue ? Я имею в виду, что мы находимся в последней команде for блока.

4. continue является неопределенной переменной, которая будет вычисляться 0 внутри (( команды. Если conitnue=something только тогда это не будет оценено. Я бы поставил там что-то вроде 7 , потому что это к счастью в моей культуре, или 1 . we are at the last command of the for block (( Команда не оценивает команды и не влияет на поток управления. (( Команда вычисляет только арифметические выражения. gnu.org/savannah-checkouts/gnu/bash/manual/…