Почему «длина» работает в «выражении» в Bash?

Здесь $expr length "geekss" "<" 5 "|" 19 - 6 ">" 10 выводит:

1

в то время как $expr length "geekss" "<" 5 "&" 19 - 6 ">" 10 выводит:

0

Я немного запутался с выводами. Как length работает под expr?

Это особенность программы, см. справочная страница. Кстати, bash имеет значение для цитирования, необходимого для передачи аргументов программе, но не влияет на саму программу.

dave_thompson_085 17.03.2022 03:40

До bash (в Bourne-shell и т. д.) expr (не $expr) был способом найти длину строки (или сопоставить с регулярным выражением, или извлечь подстроку, или найти индекс первого символа в данном списке внутри строки). Bash предоставляет ${#var} для возврата длины строки в var, что намного эффективнее, чем вызов expr. См. мужчина 1 экспр.

David C. Rankin 17.03.2022 05:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
37
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Разница между двумя командами (при условии, что вы показываете $ как подсказку, а не как расширение переменной) заключается в изменении с | на &. сходство в двух утверждениях:

  • 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

Другие вопросы по теме