В 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