как правильно использовать пользовательские методы, которые проверяют аргумент, например, является ли строка словом или номером версии, в условном контексте в 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 нет оператора двойной скобки.