Во многих языках можно присваивать результат оператора case / switch переменной, а не повторять присвоение переменной много раз внутри оператора case. Можно ли сделать что-то подобное в оболочке Bash?
color_code=$(case "$COLOR" in
(red) 1;;
(yellow) 2;;
(green) 3;;
(blue) 4;;
esac)
(Или, как в стороне, в любых других оболочках?)
bash
shell
assignment
case
иконоборец
источник
источник
(
с. В противном случае это нормально.Ответы:
variable=$(...)
Конструкция будет принимать стандартный вывод любой команды в$(...)
и назначить егоvariable
. Таким образом, чтобы получитьvariable
присвоенный вам путь, значения должны быть отправлены на стандартный вывод. Это легко сделать с помощьюecho
команды:Это будет работать
bash
как и все другие оболочки POSIX.Необязательные левые парены
В соответствии со стандартом POSIX левые символы в
case
выражении являются необязательными, а также работает следующее:Как отмечает Жиль в комментариях, не все оболочки принимают обе формы в сочетании с
$(...)
: для внушительно подробной таблицы совместимости см. «$ ()» Подстановка команд вместо встроенной «)» .источник
(
является необязательным. Я думал , что это могло бы помочь избежать позволить)
быть неверно истолкована как закрытие)
для$(...)
выражения.(
является обязательным: код работает так же, без или без них. Я оставил их только потому, что, к лучшему или к худшему, это традиция. Ключевой частью предлагаемого решения является использованиеecho
.(
дляcase
моделей, но некоторые снаряды делали и требовали открытия ,(
когдаcase
используются в подстановке команд. Современные оболочки хороши в любом случае. См. In-ulm.de/~mascheck/various/cmd-substcolor_code=$(…)
присваивает выходные данные…
команды переменнойcolor_code
, с окончательными символами новой строки. Так что вам нужно произвести какой-то вывод. Код, который вы написали, пытается выполнить1
как команду.Вы можете использовать эту идиому. Обратите внимание, что
color_code
будет пустым, если$COLOR
не поддерживается ни одно из поддерживаемых значений.Но это не очень идиоматично. Язык оболочки ориентирован на простые комбинации простых команд. Эта большая командная замена неудобна. Подстановка команд создает подоболочку, которая медленнее, чем простой метод:
Основное семантическое различие между этими двумя подходами заключается в том, что
$(…)
создается подоболочка, так что любое присвоение, выход, перенаправление и т. Д., Которые выполняются внутри, не оказывают влияния снаружи.источник