file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
case "$file" in
*_"$testseq"_*) echo 'True' ;;
*) echo 'False'
esac
का उपयोग करते हुए case ... esacएक पोर्टेबल रास्ते में एक पैटर्न मैच प्रदर्शन करने के लिए सरल तरीके से एक है। यह अन्य भाषाओं में एक "स्विच" बयान के रूप में काम करता है ( bash, zsh, और ksh93भी आप करने की अनुमति देता गिरावट के माध्यम से विभिन्न असंगत तरीके में)। उपयोग किए जाने वाले पैटर्न मानक फ़ाइल नाम ग्लोबिंग पैटर्न हैं।
समस्या जो आप कर रहे हैं वह इस तथ्य के कारण है कि _एक चर नाम में एक मान्य वर्ण है। शेल इस प्रकार *_$testseq_*" *_चर के मूल्य के बाद $testseq_और एक *" के रूप में देखेंगे । चर $testseq_अपरिभाषित है, इसलिए इसे एक रिक्त स्ट्रिंग में विस्तारित किया जाएगा, और आप के साथ समाप्त होता है *_*, जो स्पष्ट रूप से $fileआपके पास मूल्य से मेल खाता है। आप कम से कम एक अंडरस्कोर में Trueफ़ाइल नाम के रूप में लंबे समय तक प्राप्त करने की उम्मीद कर सकते हैं $file।
चर के नाम को ठीक से परिसीमन करने के लिए, "..."विस्तार के चारों ओर उपयोग करें *_"$testseq"_*:। यह एक स्ट्रिंग के रूप में चर के मूल्य का उपयोग करेगा। क्या आप एक पैटर्न के रूप में चर के मूल्य का उपयोग करना चाहते हैं , *_${testseq}_*इसके बजाय का उपयोग करें ।
एक और त्वरित फिक्स में $testseqनिम्न को शामिल करना है :
testseq="_gen_"
और फिर *"$testseq"*पैटर्न (स्ट्रिंग तुलना के लिए) के रूप में उपयोग करें ।