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"*як зразок (для порівняння рядків).