Как построить условное задание в 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=$?


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


Обратите внимание: в 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
    (что, впрочем, замечательно, если у вас несколько условий!)
  • не раскрывает подоболочку, как в ответе Пьера
  • и как указано выше:

Большое спасибо @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

$OTHERSDKiphoneos

По -другому

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

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

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

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

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