Как я могу написать сценарий оболочки, который будет делать нечувствительное к регистру совпадение подстроки вывода команды?
shell-script
shell
string
Мигель Рок
источник
источник
grep -i
может быть?bash
, является надмножеством стандарта unixsh
. Вы можете начать с рассмотрения одного из них: | 1 | | 2 | - просто чтобы понять, что является фактическим контекстом.Ответы:
Сначала вот простой пример скрипта, который не игнорирует регистр:
Попробуйте изменить строку hello справа, и она больше не должна отображаться
it works
. Попробуйте заменитьecho hello
на команду по вашему выбору. Если вы хотите игнорировать регистр, и ни одна из строк не содержит перенос строки, вы можете использовать grep:Ключевым моментом здесь является то, что вы передаете выходные данные команды
grep
.if
Заявление проверяет статус выхода из крайней правой команды в трубопроводе - в этом случае Grep. Grep успешно завершает свою работу тогда и только тогда, когда находит совпадение.-i
Вариант Grep говорит игнорировать регистр. Вариант говорит не веет выход и выход после первого матча. Вариант говорит , чтобы рассматривать аргумент в виде строки , а не регулярное выражение.-q
-F
Обратите внимание, что в первом примере используются прямые сравнения и различные полезные операторы. Вторая форма просто выполняет команды и проверяет их состояние выхода.
[ expression ]
источник
==
это не POSIX.sh
неbash
на всех системах на основе Linux.==
не поддерживаетсяash
(на чемsh
основаны многие BSD и производные Debian по крайней мере), илиposh
, и потребности указаны вzsh
. Там нет смысла удваивать=
.[
это команда для тестирования. Нет необходимости делать разногласия между назначением и сравнением здесь. Это отличается от(( a == b ))
против(( a = b))
. Использование==
в сценарии, которое начинается с#! /bin/sh
, неправильно. Если вы предполагаетеksh
илиbash
синтаксис, обновите#!
соответственно.Вы можете выполнить подстроку без учета регистра,
bash
используя собственно оператор regex,=~
если вы установилиnocasematch
опцию оболочки. Напримеристочник
[[ XYZ == xyz ]] && echo "match"
=>match
Для поиска строки с учетом регистра значения переменной
needle
в значении переменнойhaystack
:Для поиска строки без учета регистра конвертируйте оба в один и тот же регистр.
Обратите внимание, что
tr
coreutils в GNU не поддерживает многобайтовые локали (например, UTF-8). Чтобы работать с многобайтовыми локалями, используйте вместо этого awk. Если вы собираетесь использовать awk, вы можете сделать сравнение строк, а не только преобразование.tr
BusyBox не поддерживает синтаксис; Вы можете использовать вместо этого. BusyBox не поддерживает локали, отличные от ASCII.[:CLASS:]
tr a-z A-Z
В bash (но не sh) версии 4.0+ имеется встроенный синтаксис для преобразования регистра и более простой синтаксис для сопоставления строк.
источник
printf | tr
заставляет мою голову кружиться. Там, где это возможно, сводите вызов команд к минимуму ... учитывая переменную v, вы можете выполнить то же самое, используяv=$(tr '[:lower:]' '[:upper:]' <<<$v)
. Для тех, кто никогда не видел его раньше, по<<<
сути это «переменная здесь», как использование<<EOF
для документа здесь. Не делайте этогоprintf
илиecho
если только вы абсолютно не обязаны это делать.<<<
оператор: ksh, bash, zsh, но не обычный sh. И это довольно близко к трубопроводу сprintf
точки зрения того, как он работает: там одинаковое количество вызововfork
иexecve
(при условии, чтоprintf
оно встроено, что имеет место в большинстве распространенных оболочек); Разница в том, что<<<
вместо временного канала создается временный файл.<<<
удобно набирать, но не улучшение производительности.