Я ищу способ создания условных присвоений в 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