Проверьте, содержит ли строка строку подстроки

У меня есть код

file="JetConst_reco_allconst_4j2t.png" if [[ $file == *_gen_* ]]; then echo "True" else echo "False" fi 

Я проверяю, содержит ли file «gen». Выход «False». Ницца!

Проблема заключается в том, что я testseq «gen» переменной testseq :

 file="JetConst_reco_allconst_4j2t.png" testseq="gen" if [[ $file == *_$testseq_* ]]; then echo "True" else echo "False" fi 

Теперь выход «True». Как это могло произойти? Как решить проблему?

3 Solutions collect form web for “Проверьте, содержит ли строка строку подстроки”

Вам нужно интерполировать переменную $testseq одним из следующих способов:

  • $file == *_"$testseq"_* (здесь $testseq рассматривается как фиксированная строка)

  • $file == *_${testseq}_* (здесь $testseq рассматривается как шаблон).

 file="JetConst_reco_allconst_4j2t.png" testseq="gen" case "$file" in *_${testseq}_*) echo 'True' ;; *) echo 'False' ;; esac 

Использование case ... esac – один из самых простых способов выполнить сопоставление шаблонов переносимым способом. Он работает как оператор «switch» на других языках ( bash и ksh93 также позволяют вам делать ksh93 различными способами). Используемые шаблоны – это шаблоны шаблонов стандартных имен файлов.

Проблема, с которой вы сталкиваетесь, связана с тем, что _ является допустимым символом в имени переменной. Таким образом, оболочка увидит *_$testseq_* как « *_ за которым следует значение переменной $testseq_ и a * . Переменная $testseq_ не определена, поэтому она будет расширена до пустой строки, и вы получите *_* , что, очевидно, соответствует. Поэтому вы можете ожидать True если имя файла в $file содержит хотя бы одно подчеркивание.

Чтобы правильно разграничить имя переменной, используйте {...} вокруг своего имени: *_${testseq}_* .

Еще одно быстрое решение – включить $testseq подчеркивания в значение $testseq :

 testseq="_gen_" 

а затем просто используйте *$testseq* в качестве шаблона.

Для выполнения регулярных выражений используйте оператор =~ :

 #!/bin/bash file="JetConst_reco_allconst_4j2t.png" testseq="gen" if [[ $file =~ $testseq ]]; then echo "True" else echo "False" fi 

Таким образом, он будет сравнивать, если $file имеет $testseq в его содержимом.

 user@host:~$ ./string.sh False 

Если я изменяю testseq="Const" :

 user@host:~$ ./string.sh True 

Но будьте осторожны с тем, с чем вы кормите $testseq . Если строка на нем somehows представляет собой регулярное выражение (например, [0-9] ), появляется больше шансов вызвать «совпадение».

Ссылка :

  • Расширенное руководство по скрипту Bash
  • Как добавить текст в переменную в make-файле?
  • Shell: как использовать 2 переменные с условием
  • захватить из текстового файла диапазон с использованием двух переменных в качестве начального и конечного параметров
  • команда `read` не работает в Makefile
  • Создать переменную на основе порядка, в котором файл находится в алфавитном списке файлов
  • Используйте sed для извлечения переменной из 1 файла и поместите ее в другую
  • bash - определяющие переменные с VAR = $ {: - по умолчанию}
  • Как изменить переменные
  • Переменная в команде find задана новой переменной в bash
  • Как я могу объединить переменную оболочки с другими другими параметрами в моих командных строках?
  • Передать переменную с помощью EOF и использовать переменную хоста
  • Linux и Unix - лучшая ОС в мире.