Подтвердить что ты не робот

Как построить условное назначение в bash?

Я ищу способ создания условных присвоений в bash:

В Java это выглядит так:

int variable= (condition) ? 1 : 0;
4b9b3361

Ответ 1

Согласно комментарию Джонатана:

variable=$(( 1 == 1 ? 1 : 0 ))  

EDIT:

Я пересмотрел исходный ответ, который просто echo 'd - значение оператора условия, на самом деле он не показывал никакого назначения.

Ответ 2

Если вы хотите определить значения по умолчанию в оболочке script, используйте следующий код:

: ${VAR:="default"}

Да, линия начинается с ':'. Я использую это в сценариях оболочки, поэтому я могу переопределять переменные в ENV или использовать по умолчанию.

Это связано с тем, что это мой самый распространенный случай использования для такой логики.;]

Ответ 3

myvar="default" && [[ <some_condition_is_true> ]]  && myvar="non-default"

реальные примеры:

DELIM="" && [[ "$APP_ENV_RESOLVED" != "" ]] && DELIM=$INNER_DELIM

Условие может быть "((...))":

filepath=/proc/drbd && (( $# > 0 )) && filepath=$1

Ответ 4

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

$OTHERSDKiphoneos

Ответ 5

Я хотел выполнить условное присваивание со строками, и я закончил с:

SOWHAT=$([ "$MYVALUE" = "value" ] && echo "YES" || echo "NO")

Ответ 6

В дополнение к другим более общим ответам (особенно по Джонатану 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=$?


Преимущества этого решения заключаются в том, что

  • он поддерживает произвольный условные выражения, включая строки
    (которые не поддерживаются в арифметические выражения решения Jonathan
  • что variable объявляется в любом случае, в отличие от giffon answer:
    [ -z "$variable" ] && variable="defaultValue"
    Что бы вопрос, если вы хотите nameref позже (например, изнутри функции).


Обратите внимание: В 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


Преимущества этого решения заключаются в том, что

  • его можно считать немного лучше читаемым, чем Kevin answer
    myvar="default" && [[ <some_condition_is_true> ]] && myvar="non-default" и
  • $valueIfTrue условно оценивается только при необходимости, что будет иметь значение, если вы что-то сделаете
    • с побочным эффектом, например
      • variable=$((i++)), или
      • { variable=$1; shift; }
    • высокие вычисления, например
      • variable=$(find / -type f -name ListOfFilesWithThisNameOnMySystem)
  • немного короче, чем ghostdog74 answer (что, однако, отлично, если у вас есть несколько условий!)
  • не открывает подоболочку, как в Pierre answer
  • и как указано выше:
    • он поддерживает произвольный условные выражения, включая строки
      (которые не поддерживаются в арифметические выражения решения Jonathan
    • что variable объявляется в любом случае, в отличие от giffon answer:
      [ -z "$variable" ] && variable="defaultValue"
      Что бы вопрос, если вы хотите nameref позже (например, изнутри функции).

Ответ 7

Если вы хотите присвоить значение, если только пустая переменная, используйте это:

[ -z "$variable" ] && variable="defaultValue"

Вы можете также установить условия друг друга на []

Ответ 8

другой способ

case "$variable" in
  condition ) result=1;;
  *) result=0;;
esac