Как построить условное задание в bash?
Я ищу способ построения условных назначений в Bash:
В Java это выглядит так:
int variable= (condition) ? 1 : 0;
8 ответов
Согласно комментарию Джонатана:
variable=$(( 1 == 1 ? 1 : 0 ))
РЕДАКТИРОВАТЬ:
Я пересмотрел оригинальный ответ, который просто echo
Если бы значение оператора условия не было, оно фактически не показывало назначения.
Если вам нужен способ определения значений по умолчанию в сценарии оболочки, используйте такой код:
: ${VAR:="default"}
Да, строка начинается с ':'. Я использую это в сценариях оболочки, поэтому я могу переопределять переменные в ENV или использовать значения по умолчанию.
Это связано с тем, что это мой самый распространенный вариант использования для такой логики.;]
Я хотел сделать условное присвоение со строками, и я закончил с:
SOWHAT=$([ "$MYVALUE" = "value" ] && echo "YES" || echo "NO")
myvar="default" && [[ <some_condition_is_true> ]] && myvar="non-default"
реальные примеры:
DELIM="" && [[ "$APP_ENV_RESOLVED" != "" ]] && DELIM=$INNER_DELIM
Условие также может быть "(( ...))":
filepath=/proc/drbd && (( $# > 0 )) && filepath=$1
В дополнение к другим более общим ответам (особенно в соответствии с комментарием Джонатана и более общим ответом Кевина [который также поддерживает строки]), я хотел бы добавить следующие два решения:
установка переменной либо 0
или же 1
исходя из условия:
(как показывает пример вопроса.)
Общая форма будет читать
(condition); variable=$?;
где $variable
приводит к тому, что либо 0
или же 1
а также condition
может быть любым допустимым условным выражением.
Например, проверка переменной...
[[ $variableToCheck == "$othervariable, string or number to match" ]]
variable=$?
... или проверка существования файла...
[ -f "$filepath" ]
fileExists=$?
... или проверка числового значения $myNumber
:
(( myNumber >= 1000000000 ))
is_huge_number=$?
Преимущества этого решения в том, что
- поддерживает произвольные условные выражения, включая строки
(которые не поддерживаются в арифметических выражениях решения Джонатана) - тот
variable
объявляется в любом случае, в отличие от ответа гриффона:[ -z "$variable" ] && variable="defaultValue"
Что будет иметь значение, если вы захотите переименовать его позже (например, из функции).
Обратите внимание: в Bash специальная переменная $?
всегда содержит код завершения ранее выполненного оператора (или блока операторов; более подробную информацию смотрите в man bash). Таким образом, положительный результат обычно представлен значением 0
не 1
(Смотрите мой комментарий ниже, спасибо Assimilater за указание на это).
Таким образом, если условие истинно (например, [[2 eq 2]]
) затем $?=0
, Если вместо этого вам нужно 0 или 1 в вашей переменной (например, для печати или выполнения математических вычислений), то вам нужно использовать решение Джонатана variable=$(( 1 == 1 ? 1 : 0 ))
или - если вы хотите избежать создания подоболочки или иметь произвольные условия - следующее решение.
установка переменной в произвольные значения:
как это делается в большинстве других ответов, он может быть адаптирован следующим образом:
(condition) \
&& variable=true \
|| variable=false
например, как в
[[ $variableToCheck == "$othervariable, string or number to match" ]] \
&& variable="$valueIfTrue" \
|| variable="$valueIfFalse"
или получить 1 при положительном чеке и 0 при неудаче (как в примере с вопросом):
[[ $variableToCheck == "$othervariable, string or number to match" ]] \
&& variable=1 \
|| variable=0
Преимущества этого решения в том, что
- это может считаться немного лучше читаемым, чем ответ Кевина
myvar="default" && [[ <some_condition_is_true> ]] && myvar="non-default"
, а также -
$valueIfTrue
условно оценивается только при необходимости,
что бы иметь значение, если бы вы что-то сделали- с побочным эффектом, как
variable=$((i++))
, или же{ variable=$1; shift; }
- высокие вычисления, как
variable=$(find / -type f -name ListOfFilesWithThisNameOnMySystem)
- с побочным эффектом, как
- немного короче, чем ответ ghostdog74
(что, впрочем, замечательно, если у вас несколько условий!) - не раскрывает подоболочку, как в ответе Пьера
- и как указано выше:
- поддерживает произвольные условные выражения, включая строки
(которые не поддерживаются в арифметических выражениях решения Джонатана) - тот
variable
объявляется в любом случае, в отличие от ответа гриффона:[ -z "$variable" ] && variable="defaultValue"
Что будет иметь значение, если вы захотите переименовать его позже (например, из функции).
- поддерживает произвольные условные выражения, включая строки
Большое спасибо @Demosthenex и особенно @Dennis Williamson за самое короткое и простое решение, которое я видел. Оставьте это для bash, чтобы потребовать несколько скобок для простого троичного назначения. Ааа, 60-е! И собрать все это в пример...
echo $BASHRULES; # not defined
# no output
: ${BASHRULES:="SCHOOL"} # assign the variable
echo $BASHRULES # check it
SCHOOL # correct answer
: ${BASHRULES="FOREVER?"} # notice the slightly different syntax for the conditional assignment
echo $BASHRULES # let's see what happened!
SCHOOL # unchanged! (it was already defined)
Я написал это давным-давно... в эти дни я, вероятно, буду более взволнован таким решением, как...
PLATFORM=iphonesimulator
OTHERSDK=iphone && [[ $PLATFORM=~os ]] \
&& OTHERSDK+=simulator \
|| OTHERSDK+=os
$OTHERSDK
⇥iphoneos
По -другому
case "$variable" in
condition ) result=1;;
*) result=0;;
esac
Если вы хотите присвоить значение, если переменная не пуста, используйте это:
[ -z "$variable" ] && variable="defaultValue"
Вы также можете поставить друг другу условие на []