Сценарий оболочки: оператор присваивания или оператор (a= b || c)
Как видно из заголовка, как правильно выполнить задание или (например, a= b || c
) в сценариях оболочки, в частности, csh против bash? Я не могу проверить это, поэтому, возможно, приведенный выше пример работает.
Я думал, что это довольно распространено в скриптовых языках, но для тех, кто не совсем понимает, переменная a
сохранит ценность b
если правда, в противном случае значение c
, В примере b
а также c
это выражения.
Вариант использования обычно устанавливается в a
к какому-либо значению, если оно указано, в противном случае использовать значение по умолчанию (например, a= $1 || "Foo"
).
Я не уверен, в чем причина для закрытых голосов, поскольку этот вопрос не:
- широкий
- расплывчатый
- неполный
Пожалуйста, прокомментируйте, если вам требуется дальнейшее объяснение и необходимо внести некоторые изменения.
3 ответа
Для Bash вы хотите
a=${b:-$c}
http://www.gnu.org/software/bash/manual/bashref.html
${parameter:-word}
Если параметр не установлен или ноль, расширение слова заменяется. В противном случае значение параметра подставляется.
Я полагаю, что у Гленна Джекмана есть это, но я хочу развить немного больше, чем уместится в комментарии.
Сценарии оболочки не ориентированы на выражения. Они ориентированы на команды и слова. Переменные оболочки по умолчанию являются строками (в исходной оболочке Bourne не было никакого способа создать любую другую переменную). RHS задания не является "выражением", как вы думаете об этом, и ваши b
а также c
также не являются "выражениями", даже если вы хотите, чтобы они были.
Основной синтаксис присваивания
var=string
Правая часть - это просто строка. Оболочка предлагает несколько видов расширений, которые можно использовать для создания строк, которые позволяют делать такие вещи, как
var1=string
var2=$var1
var3="This is a ${var1}"
var4=$(ls | wc -l)
var5=$(($var4 + 1))
Значение, которое присваивается каждой переменной, является строкой в RHS с некоторыми расширениями (отмечены как $
выполнил в нем.
Последний пример с $((...))
, является единственным, который действительно содержит то, что можно назвать "выражением". Расширение с двойными круглыми скобками работает с арифметическими выражениями, так что это было бы полезно использовать, если ваш b
а также c
являются числовыми
Поэтому вам следует перестать думать о желаемом результате с точки зрения выражения, которое оценивается двумя дочерними выражениями. b
а также c
в качестве входных данных, потому что понятия просто не обобщаются таким образом в языке оболочки.
Если b
является переменной, и вы хотите расширить ее значением по умолчанию, которое будет использоваться, когда переменная не установлена, затем используйте ${b-c}
, Если вы также хотите, чтобы значение по умолчанию использовалось, когда переменная установлена, но пуста, используйте ${b:-c}
, c
в этих примерах это строка, и, как и все другие строки в оболочке, она может быть построена с помощью расширений:
i=3
var=""
echo ${var:-$(cat somefile)} # since var is empty, substitute file contents
echo ${var:-$(($i * $i))} # since var is empty, do some math instead
Теперь, если ваш b
не такая переменная, как $var
вы, вероятно, обнаружите, что ничего из вышеперечисленного не применимо! Поскольку ${...:-...}
синтаксис для расширения переменной. Вы действительно должны будете указать, что b
и вы не можете сказать "выражение", потому что в оболочке такого нет.
Я предполагаю, что вы имеете в виду это (в bash):
a=1
b=2
echo $(( $a | $b ))
Что приводит к 3: 1 | 2
Операторы |, ^, &, >>
, а также <<