file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
case "$file" in
*_"$testseq"_*) echo 'True' ;;
*) echo 'False'
esac
Використання case ... esac
- це один із найпростіших способів проведення відповідності шаблону на портативний спосіб. Він працює як оператор "switch" іншими мовами ( bash
,zsh
і ksh93
також дозволяє робити осінь-через у різних несумісних способах). Використовувані шаблони - це стандартні шаблони імен файлів.
Проблема, яка виникає у вас, пов'язана з тим, що _
це дійсний символ у імені змінної. Таким чином оболонка буде сприйматися *_$testseq_*
як "з *_
подальшим значенням змінної $testseq_
та а *
". Змінна $testseq_
не визначена, тому вона буде розширена до порожнього рядка, і ви закінчите *_*
, що, очевидно, відповідає $file
значенню, яке ви маєте. Ви можете розраховувати на отримання True
, поки ім'я файлу в$file
містить хоча б одну підкреслення.
Для того, щоб правильно розмежувати ім'я змінної, використання "..."
навколо розширення: *_"$testseq"_*
. Це використовувало б значення змінної у вигляді рядка. Чи хочете ви використовувати значення змінної як візерунок , використовуйте *_${testseq}_*
замість цього.
Ще одне швидке виправлення - включити підкреслення у значення $testseq
:
testseq="_gen_"
а потім просто використовувати *"$testseq"*
як зразок (для порівняння рядків).