==
Оператор використовується для порівняння двох рядків в скрипті оболонки. Однак я хочу порівняти два рядки ігнорування випадку, як це можна зробити? Чи є для цього стандартна команда?
==
Оператор використовується для порівняння двох рядків в скрипті оболонки. Однак я хочу порівняти два рядки ігнорування випадку, як це можна зробити? Чи є для цього стандартна команда?
Відповіді:
якщо у вас баш
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
в іншому випадку ви повинні сказати нам, яку оболонку ви використовуєте.
альтернативно, використовуючи awk
str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
if ( tolower(s1) == tolower(s2) ){
print "match"
}
}'
==
використовується для порівняння двох рядків, але відповідь демонструє порівняння з урахуванням регістру, використовуючи case
оператор. Обнадіює, то shopt
рішення також дозволяє регістронезавісімого використання ==
, =~
і інші оператори порівняння рядків.
shopt -u nocasematch
після порівняння, щоб повернути назад до дефолту bash.
nocasematch
налаштування. Візьміть його, SHELLNOCASEMATCH=`shopt -p nocasematch`
потім змініть його shopt -s nocasematch
і, як тільки буде зроблено, відновіть його$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
тому, що shopt -p
вийде з кодом 1, якщо параметр не встановлений, і це може спричинити скасування сценарію, якщо set -e
він діє.
У Bash ви можете використовувати параметри розширення, щоб змінити рядок для всього нижнього / верхнього регістру:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
echo
твердження призводить до:-bash: ${var1,,}: bad substitution
shopt -s nocasematch
це реалізовано, але зазвичай такі рішення на рівні "мови" справляються з цим правильно.
Усі ці відповіді ігнорують найпростіший і швидкий спосіб зробити це (поки у вас є Bash 4):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
Все, що ви там робите, - це перетворення обох рядків у малі та порівняння результатів.
Збережіть стан nocasematch (у випадку, якщо якась інша функція залежить від її відключення):
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
Примітка. Використовуйте лише, local
якщо він знаходиться у межах функції.
case
заяви (включаючи відповіді у відповіді
Одним із способів було б перетворення обох рядків у верхній або нижній:
test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different
Іншим способом було б використання grep:
echo "string" | grep -qi '^String$' && echo same || echo different
tr
метод у своїх докерських програмах на основі альпійських (що надає sh
через busybox
). Дякую.
Для оболонки korn я використовую вбудовану команду typeset (-l для нижнього регістру та -u для верхнього регістру).
var=True
typeset -l var
if [[ $var == "true" ]]; then
print "match"
fi
Дуже просто, якщо ви перекочуєтесь, щоб порівняти нечутливу до регістру лінію:
str1="MATCH"
str2="match"
if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
echo "case-insensitive match";
fi
Для zsh
синтаксису трохи відрізняється, але все ж менше , ніж більшість відповідей тут:
> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>
Це перетворить обидва рядки у великі регістри перед порівнянням.
Інший метод використовує zsh globbing flags
, який дозволяє нам безпосередньо використовувати збіг, що не враховує регістри, використовуючи i
прапор глобуса:
setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
[[ $str1 = (#i)match ]] && echo "Match success"
shopt -s nocaseglob
Я натрапив на цей чудовий блог / навчальний посібник / що завгодно щодо роботи з чутливою до регістру моделлю . Наступні три методи детально пояснюються прикладами:
1. Перетворення шаблону в малі регістри за допомогою команди tr
opt=$( tr '[:upper:]' '[:lower:]' <<<"$1" )
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other options"
;;
esac
2. Використовуйте регулярний вираз із шаблонами
opt=$1
case $opt in
[Ss][Qq][Ll])
echo "Running mysql backup using mysqldump tool..."
;;
[Ss][Yy][Nn][Cc])
echo "Running backup using rsync tool..."
;;
[Tt][Aa][Rr])
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
3. Увімкніть nocasematch
opt=$1
shopt -s nocasematch
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
shopt -u nocasematch
if
оператори,shopt
підхід вимагає використовувати[[ ]]
умовну форму з подвійною дужкою замість форми з однією дужкою[ ]
. Дивіться також: gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html