Какова наилучшая практика для представления логического значения в сценарии оболочки?

Я знаю, что в bash есть логические значения, но я никогда их не вижу.

Я хочу написать обертку для некоторой часто просматриваемой информации на моей машине, например, этот конкретный USB-диск вставлен / установлен.

Какая была бы лучшая практика для достижения этого?

  • Строка?

     drive_xyz_available=true 
  • Число (0 для true, ≠ 0 для false)?

     drive_xyz_available=0 # evaluates to true 
  • Функция?

     drive_xyz_available() { if available_magic; then return 0 else return 1 fi } 

Я в основном задаюсь вопросом, чего ожидали бы другие люди, которые хотели бы использовать обертку. Будут ли они ожидать логическое значение, такую ​​как переменная или функция для вызова?

С точки зрения безопасности я бы подумал, что второй вариант является самым безопасным, но я бы хотел услышать ваши впечатления.

3 Solutions collect form web for “Какова наилучшая практика для представления логического значения в сценарии оболочки?”

 bool(){ return "$((!${#1}))"; } if bool "$var" then : do true else : do false 

Просто установите переменную на что-нибудь, но не-null, чтобы выше работала, хотя [ -n "$var" ] будет короче, если не так очевидно.

В общем случае, когда сценарий интерпретирует переменную среды как истину или ложь, она будет интерпретировать любое значение вообще как истинное (и иногда использовать указанное значение для настройки некоторого параметра), или же значение null как false.

Вышеприведенное возвращает значение boolean !not Not его len первого аргумента – если аргумент содержит любое количество символов, отличных от 0, он возвращает 0, иначе, если вообще никаких символов, он возвращает 1. Это тот же тест, который вы можете выполнить с помощью [ -n "$var" ] , в основном, но он просто переносит его в маленькую функцию с именем bool() .

Как правило, это переменная флагов . Например:

 [ -d "$dir" ] || dir= 

Там, где другие части скрипта должны искать только какую-либо ценность в $dir чтобы оценить ее полезность. Это также полезно, если речь идет о замене параметров, поскольку параметры могут быть расширены до значений по умолчанию, заполняемых для пустых или незанятых, но в противном случае они будут расширяться до заданного значения, например …

 for set in yes '' do echo "${set:-unset or null}" done 

… который будет печатать …

 yes unset or null 

Конечно, возможно также сделать обратное :+ но это может только дать вам предустановленное значение по умолчанию или ничего вообще, тогда как приведенная выше форма может дать вам значение или значение по умолчанию.

Итак, в отношении трех вариантов – любой может работать в зависимости от того, как вы решите его реализовать. Возврат функции является самотестированием, но если это возвращение требует сохранения по какой-либо причине, необходимо будет ввести переменную. Это зависит от варианта использования – это логическое значение, которое вы хотите оценить один раз и тип? Если да, то выполняйте эту функцию, иначе, возможно, потребуется одна из двух других.

В bash каждая переменная по существу является строкой (или массивом или функцией, но давайте поговорим об обычных переменных здесь).

Условия анализируются на основе возвращаемых значений тестовых команд – возвращаемое значение не является переменной, это состояние выхода. Когда вы оцениваете, if [ ... ] или if [[ ]] или if grep something или что- if grep something , возвращаемое значение 0 (не строка 0, а статус выхода 0 = успех) означает true, а остальное – false (так, прямо противоположное тому, с которым вы привыкли в скомпилированных языках программирования, но потому, что есть один способ добиться успеха и много способов потерпеть неудачу, и ожидаемый результат исполнения обычно является успешным, 0 используется как самый общий результат по умолчанию, если ничего не происходит неправильно). Это очень полезно, потому что любой бинарный файл можно использовать в качестве теста – если он терпит неудачу, он неверен, иначе это правда.

true и false программы (обычно переопределенные встроенными компонентами) просто полезны небольшим программам, которые ничего не делают – true преуспевает в том, чтобы ничего не делать, а выходит с 0, а false попытки ничего не делают и «терпят неудачу», выходят с 1. Звуки бессмысленны, но это очень удобный для скриптов.

Что касается того, как пройти правдивость, это зависит от вас. Очень просто использовать «y» или «yes» для правды и использовать, if [ x"$variable" = x"yes" ] (добавлена ​​фиктивная строка x потому что если $variable имеет нулевую длину, это защищает от создания фальшивая команда, if [ = "yes" ] которая не анализируется). Также может быть полезно просто использовать пустую строку для false и использовать [ -z "$variable ] для проверки, является ли она нулевой (или -n для нее отличной от нуля).

Во всяком случае, довольно редко приходится переходить вокруг булевых значений в bash – гораздо более часто бывает просто exit из отказа или вернуть полезный результат (или нуль, если что-то пойдет не так, и протестировать пустую строку), и большая часть случаи могут проверяться на отказ непосредственно из выходного statatus.


В вашем случае вам нужна функция, которая будет действовать как любая другая команда (поэтому возвратите 0 при успешном завершении), поэтому ваш последний вариант кажется правильным выбором.

Кроме того, вам может даже не понадобиться инструкция return . Если функция достаточно проста, вы можете использовать тот факт, что она просто возвращает статус последней выполненной команды в функции. Таким образом, ваша функция может быть просто

 drive_xyz_available() { [ -e /dev/disk/by-uuid/whatever ] } 

если вы тестируете наличие узла устройства (или grep /proc/mounts чтобы проверить, смонтирован ли он?).

В принципе, любое число, которое не равно 0, равно true, а 0 – false. Причина возврата значений как 0 для успешного завершения скрипта или любого другого номера для идентификации различных типов ошибок.

$? вернет код выхода предыдущей команды / исполняемого файла, получив 0-й успех, а любой другой номер – полученную ошибку.

Поэтому я бы использовал этот метод для true / false. if (( ! $? ));then OK;else NOOK;fi

  • Проблема с символом ':' в скрипте Bash через SSH
  • Создание следующего доступного имени файла для шаблона (02-output.log и т. Д.)
  • Могу ли я изменить способ отображения параметров выбора?
  • Ловушка Ctrl-C в awk-скрипте
  • Самый простой способ найти отсутствующую цитату в bash скрипт?
  • Поверните скрипт bash и php в распределяемый rpm
  • Список файлов в иерархии каталога
  • Выберите содержимое, соответствующее определенному контенту из файла, и переместите его в выходной файл
  • Как установить пары фиксированного значения, вертикально ориентированные пары ключ-значение в файле CSV?
  • Выполнить стандартный вывод с функцией
  • Создайте пакетный скрипт SOX для извлечения первых 15 секунд и переименуйте несколько файлов в папку
  • Linux и Unix - лучшая ОС в мире.