==Оператор використовується для порівняння двох рядків в скрипті оболонки. Однак я хочу порівняти два рядки ігнорування випадку, як це можна зробити? Чи є для цього стандартна команда?
==Оператор використовується для порівняння двох рядків в скрипті оболонки. Однак я хочу порівняти два рядки ігнорування випадку, як це можна зробити? Чи є для цього стандартна команда?
Відповіді:
якщо у вас баш
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