Здесь $expr length "geekss" "<" 5 "|" 19 - 6 ">" 10
выводит:
1
в то время как $expr length "geekss" "<" 5 "&" 19 - 6 ">" 10
выводит:
0
Я немного запутался с выводами. Как length
работает под expr
?
До bash (в Bourne-shell и т. д.) expr
(не $expr
) был способом найти длину строки (или сопоставить с регулярным выражением, или извлечь подстроку, или найти индекс первого символа в данном списке внутри строки). Bash предоставляет ${#var}
для возврата длины строки в var
, что намного эффективнее, чем вызов expr
. См. мужчина 1 экспр.
Разница между двумя командами (при условии, что вы показываете $
как подсказку, а не как расширение переменной) заключается в изменении с |
на &
. сходство в двух утверждениях:
length "geekss" < 5
неверно в обоих случаях19 - 6 > 10
верно в обоих случаяхИзменение вывода происходит в результате вашего изменения в логические тесты:
|
- это "ИЛИ", которое оценивается как «ARG1, если он не равен нулю или 0, иначе ARG2»&
- это "И", которое оценивается как «ARG1, если ни один из аргументов не равен нулю или 0, иначе 0»В вашем случае вариант |
оценивает истинность 19 - 6 > 10
, в то время как вариант &
видит, что length "geekss" < 5
равен 0 (ложь), и поэтому возвращает 0.
How does length work under expr?
Он получает длину строки geekss
. Строка geekss
состоит из 6 символов, поэтому length "geekss"
равно 6.
Страница man expr
тоже кажется понятной:
length STRING
length of STRING
Это особенность программы, см. справочная страница. Кстати, bash имеет значение для цитирования, необходимого для передачи аргументов программе, но не влияет на саму программу.