Bash: Как использовать пользовательские функции (возвращающие значение true или false) в условных конструкциях?

Bash: Как использовать пользовательские функции (возвращающие значение true или false) в условных конструкциях?

как правильно использовать пользовательские методы, которые проверяют аргумент, например, является ли строка словом или номером версии, в условном контексте в ifоператорах , whileили ?until

Особенно (двойные) фигурные скобки, похоже, имеют проблемы с методами на одной стороне теста, такими как -gt.

Могу ли я просто вызвать метод? Если да, то каковы контекстные требования для этого? Так внутри/снаружи (двойных) скобок и в различных операторах if, whileи until- как они реагируют на вызов функций без подстановки команд?

И если я не использую подстановку команд для вызова различных тестовых методов, могу ли я все равно соединить их с помощью булевых операторов?

Существуют ли случаи, когда для их соединения необходимо использовать скобки или двойные скобки?

Когда мне нужно расширение команды? Может ли мне иногда понадобиться арифметическое расширение для вызова функций?

решение1

Вам нужно, чтобы ваша функция возвращала успешное/неуспешное выполнение true/false через статус выхода, как и все другие команды, включая эту [команду, либо используя returnвстроенную функцию с 0 в качестве аргумента для true/success и любым другим значением для false/false, либо просто возвращаясь при выходе из последней команды, запущенной функцией:

isnewer() {
  [ "$1" -nt "$2" ]
  # here returns with the status of the [ command
}

isvowel() {
  case $1 in
    ([aeiouAEIOU]) true;; # or return 0
    (*) false;;           # or return 1
  esac
}

Этот код возвращает код завершения caseсоставной команды, которая в свою очередь возвращает код последней выполненной команды (то есть здесь либо код , trueлибо falseкоманда ).

И затем в вашем операторе if/ whileвы вызываете эти функции, а не [команду:

if isnewer /etc/passwd /etc/shadow; then
  echo passwd newer than shadow
fi
if isvowel "$x" || isvowel "$y"; then...

Что касается Ваших (непонятных мне) ссылок на двойные фигурные скобки или двойные круглые скобки, то while [— это просто обычная команда (другое название команды test), в оболочке Korn и некоторых производных, включая bash:

  • конструкция (( arithmetic expression )), которая вычисляет арифметическое выражение (следуя синтаксису, похожему на синтаксис языка C и различающемуся в разных оболочках) и возвращает значение true/success (через статус выхода 0, как обычно), если результирующее число отлично от 0. В этом синтаксисе арифметического выражения есть некоторые операторы сравнения и булевы операторы, похожие на операторы языка C ( <, >=, ||, &&...).
  • конструкция [[ conditional expression ]], которая оценивает условное выражение (со своим собственным синтаксисом, также различающимся от оболочки к оболочке и напоминающим способ, которым разбирает [свой аргумент). Эта конструкция, как и команда [/, testможет использоваться для выполнения ряда тестов, подобных -ntприведенным выше, или сравнения строк или даже чисел.

Однако в bash нет оператора двойной скобки.

Связанный контент