Я ищу способ создания условных присвоений в bash:
В Java это выглядит так:
int variable= (condition) ? 1 : 0;
Я ищу способ создания условных присвоений в bash:
В Java это выглядит так:
int variable= (condition) ? 1 : 0;
Согласно комментарию Джонатана:
variable=$(( 1 == 1 ? 1 : 0 ))
Я пересмотрел исходный ответ, который просто echo 'd - значение оператора условия, на самом деле он не показывал никакого назначения.
Если вы хотите определить значения по умолчанию в оболочке script, используйте следующий код:
: ${VAR:="default"}
Да, линия начинается с ':'. Я использую это в сценариях оболочки, поэтому я могу переопределять переменные в ENV или использовать по умолчанию.
Это связано с тем, что это мой самый распространенный случай использования для такой логики.;]
myvar="default" && [[ <some_condition_is_true> ]] && myvar="non-default"
реальные примеры:
DELIM="" && [[ "$APP_ENV_RESOLVED" != "" ]] && DELIM=$INNER_DELIM
Условие может быть "((...))":
filepath=/proc/drbd && (( $# > 0 )) && filepath=$1
Big ups для @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 see what happened!
SCHOOL # unchanged! (it was already defined)
Я писал, что давным-давно.. в эти дни я, вероятно, буду больше взволнован над решением вроде...
PLATFORM=iphonesimulator
OTHERSDK=iphone && [[ $PLATFORM=~os ]] \
&& OTHERSDK+=simulator \
|| OTHERSDK+=os
$OTHERSDK⇥iphoneos
Я хотел выполнить условное присваивание со строками, и я закончил с:
SOWHAT=$([ "$MYVALUE" = "value" ] && echo "YES" || echo "NO")
В дополнение к другим более общим ответам (особенно по Джонатану comment и Kevin более общий ответ [который также поддерживает строки]) Я хотел бы добавить следующие два решения:
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 объявляется в любом случае, в отличие от giffon answer: [ -z "$variable" ] && variable="defaultValue"
Обратите внимание: В Bash специальная переменная $? всегда содержит код выхода ранее выполненного оператора (или блока оператора, см. man bash для получения более подробной информации). Таким образом, положительный результат обычно представлен значением 0, а не 1 (см. Мой комментарий ниже, благодаря Assimilater для указав это).
Таким образом, если условие истинно (например, [[2 eq 2]]), то $?=0. Если вместо этого вам нужно 0 или 1 в вашей переменной (например, для печати или выполнения математических вычислений), тогда вам нужно использовать решение Jonathan 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)variable объявляется в любом случае, в отличие от giffon answer: [ -z "$variable" ] && variable="defaultValue" Если вы хотите присвоить значение, если только пустая переменная, используйте это:
[ -z "$variable" ] && variable="defaultValue"
Вы можете также установить условия друг друга на []
другой способ
case "$variable" in
condition ) result=1;;
*) result=0;;
esac