コードを持っています
file="JetConst_reco_allconst_4j2t.png"
if [[ $file == *_gen_* ]];
then
echo "True"
else
echo "False"
fi
file
に「gen」が含まれているかどうかをテストします。出力は「False」です。いいね!
問題は、「gen」を変数testseq
に置き換えるときです。
file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
if [[ $file == *_$testseq_* ]];
then
echo "True"
else
echo "False"
fi
これで出力は「True」になります。それはどうでしょうか?問題を解決するには?
$testseq
変数は、次のいずれかの方法で補間する必要があります。
$file == *_"$testseq"_*
(ここでは$testseq
は固定文字列と見なされます)
$file == *_${testseq}_*
(ここでは$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
のフィードには注意してください。上の文字列が何らかの形で正規表現を表している場合([0-9]
など)、「一致」をトリガーする可能性が高くなります。
参照:
file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
case "$file" in
*_"$testseq"_*) echo 'True' ;;
*) echo 'False'
esac
case ... esac
の使用は、移植可能な方法でパターン照合を実行する最も簡単な方法の1つです。他の言語では「switch」ステートメントとして機能します(bash
、zsh
、およびksh93
を使用すると、さまざまな非互換でfall-throughを実行することもできます)方法)。使用されるパターンは、標準のファイル名グロビングパターンです。
発生している問題は、_
が変数名の有効な文字であることによるものです。したがって、シェルは*_$testseq_*
を "*_
の後に変数$testseq_
の値と*
"が続くものとして認識します。変数$testseq_
は定義されていないため、空の文字列に展開され、最終的に*_*
になり、これは明らかに$file
の値と一致します。 $file
のファイル名に少なくとも1つのアンダースコアが含まれている限り、True
を取得することが期待できます。
変数の名前を適切に区切るには、展開の前後に"..."
を使用します:*_"$testseq"_*
。これは、変数の値を文字列として使用します。変数の値をパターンとして使用する場合は、代わりに*_${testseq}_*
を使用します。
別の簡単な修正は、アンダースコアを$testseq
の値に含めることです:
testseq="_gen_"
次に、パターンとして(文字列比較の場合)*"$testseq"*
を使用します。
文字列に部分文字列が含まれているかどうかをテストするポータブルな方法については、次を使用します。
file="JetConst_reco_allconst_4j2t.png"; testseq="gen"
[ "${file##*$testseq*}" ] || echo True Substring is present
または"${file##*"$testseq"*}"
は、testseq
内のグロブ文字の解釈を回避します。