Сценарий оболочки: оператор присваивания или оператор (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

Операторы |, ^, &, >>, а также <<

Другие вопросы по тегам