В дополнение к другим более общим ответам (особенно в соответствии с комментарием Джонатана и более общим ответом Кевина [который также поддерживает строки]), я хотел бы добавить следующие два решения:
установка переменной либо 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"
Что имеет значение, если вы хотите nameref позже (например, из функции).
Обратите внимание: В Bash специальная переменная $?
всегда содержит код завершения ранее выполненного оператора (или блока операторов; для получения более подробной информации см. man bash ). Таким образом, положительный результат обычно представлен значением 0
, а не 1
(см. Мой комментарий ниже , спасибо Assimilater за , указывающим его ). Таким образом, если условие истинно (например, [[2 eq 2]]
), то $?=0
.
Если вместо этого вам нужно 0 или 1 в вашей переменной (например, для печати или выполнения математических вычислений), тогда вам нужно использовать логическое отрицание, используя ведущий восклицательный знак (как указано GypsySpellweaver в комментариях ниже ): ( ! condition ); variable=$?
или ! ( condition ); variable=$?
. (Однако читаемость с точки зрения того, что происходит, может быть немного менее очевидна.)
Другим возможным решением от Джонатана было бы 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
(для последнего примера - как уже упоминалось в примечаниях выше) - то же самое можно достичь с помощью логического отрицания с использованием ведущего восклицательного знака:
[[ ! $variableToCheck == "$othervariable, string or number to match" ]]
variable=$?
Преимущества этого решения в том, что
- его можно считать немного лучше читаемым , чем ответ Кевина
myvar="default" && [[ <some_condition_is_true> ]] && myvar="non-default"
и
-
$valueIfTrue
оценивается условно * только 1124 * при необходимости ,
, что будет иметь значение в случае, если вы что-то сделаете
- с побочным эффектом, вроде
variable=$((i++))
или
{ variable=$1; shift; }
- высокие вычисления, как
variable=$(find / -type f -name ListOfFilesWithThisNameOnMySystem)
- немного короче , чем ответ ghostdog74
(что, впрочем, замечательно, если у вас несколько условий!)
- не открывает подоболочку, как в ответе Пьера
- и как указано выше: