В bash
каждой переменной по сути есть строка (или массив, или функция, но давайте поговорим о обычных переменных здесь).
Условия анализируются на основе возвращаемых значений тестовых команд - возвращаемое значение не является переменной, это состояние выхода. Когда вы оцениваете if [ ... ]
или, if [[ ]]
или if grep something
что-то в этом роде, возвращаемое значение 0 (не строка 0, а состояние выхода 0 = успех) означает «истина», а остальные - «ложь» (то есть, совершенно противоположное тому, к чему вы привыкли в скомпилированных языках программирования, но поскольку есть один способ добиться успеха и много способов потерпеть неудачу, а ожидаемый результат выполнения обычно является успешным, 0 используется как наиболее распространенный результат по умолчанию, если ничего не происходит неправильно). Это очень полезно, потому что любой двоичный файл может быть использован в качестве теста - если он потерпит неудачу, это ложно, в противном случае это правда.
true
и false
программы (обычно переопределяемые встроенными программами) - это просто полезные маленькие программы, которые ничего не делают - true
преуспевают в том, что ничего не делают, и завершают работу с 0, в то время как false
пытаются ничего не делать и "терпят неудачу", завершаясь с 1. Звучит бессмысленно, но это очень удобно для сценариев.
Что касается того, как передать правду вокруг, это зависит от вас. Очень часто просто использовать «у» или «да» для истины и использования if [ x"$variable" = x"yes" ]
(добавляем фиктивную строку, x
потому что, если $variable
получится нулевая длина, это защищает от создания фиктивной команды, if [ = "yes" ]
которая не разбирает). Также может быть полезно просто использовать пустую строку для false и использовать [ -z "$variable ]
для проверки, является ли она нулевой длиной (или -n
для того, чтобы она была ненулевой).
В любом случае, довольно редко нужно передавать логические значения bash
- гораздо чаще просто exit
при сбое или возвращать полезный результат (или ноль, если что-то идет не так, и проверка на пустую строку), и большинство случаев может проверка на отказ непосредственно из статата о выходе.
В вашем случае вам нужна функция, которая будет действовать как любая другая команда (поэтому при успешном завершении работы вернет 0), поэтому ваш последний вариант кажется правильным выбором.
Кроме того, вам может даже не понадобиться return
заявление. Если функция достаточно проста, вы можете использовать тот факт, что она просто возвращает статус последней выполненной команды в функции. Так что ваша функция может быть просто
drive_xyz_available() {
[ -e /dev/disk/by-uuid/whatever ]
}
если вы проверяете наличие узла устройства (или grep, /proc/mounts
чтобы проверить, смонтирован ли он?).
help true ; help false ; help exit