タイトルには基本的にすべての内容が記載されていますが、生涯を把握することはできず、bash正規表現の一致によって混乱します。これはif
私のbashスクリプトの説明ですが、常にその行と一致します${new_user}
。# ${new_user}
デフォルトでは、「コメント付き」ユーザーと一致させたいと思います。
if [[ $(<"foo.txt") =~ \#.*${new_user} ]]; then
答え1
このパターンでは、正規表現を使用せずにglob式のみを使用する方がはるかに簡単です。これは^#.*${new_user}
あなたの質問と同じです。
% new_user=foo
% [[ '# somethingfoo' == '#'*"${new_user}"* ]]; echo $?
0
% [[ '# somethingbar' == '#'*"${new_user}"* ]]; echo $?
1
質問の片側にのみ固定しているので、次の文字を一致させようとしているように聞こえます$new_user
。本当に端に固定したい場合は削除してください*
。
Bashで正規表現を使用することは確かに可能ですが、人間工学と銃撃戦はかなり厄介です。可能であれば、地球や他のメカニズムを使用することをお勧めします。
正規表現を必ず使用する必要がある場合、使用方法は次のとおりです(${new_user}
正規表現文字を含む場合は引用することが唯一の違いです)。
$ [[ '# somethingfoo' =~ ^#.*"${new_user}" ]]; echo $?
0
$ [[ '# somethingbar' =~ ^#.*"${new_user}" ]]; echo $?
1
繰り返しますが、最後にアンカーを追加するには$
。
^
複数行の文脈で意味を誤解する可能性があります。 Bash では、^
行の先頭ではなく文字列の先頭と一致します。何かがあるかどうかを確認するために各行を調べる必要がある場合、if grep ...; then
または次のループを使用してください。
found=0
while IFS= read -r line || [[ $line ]]; do
if [[ "$line" == '#'*"${new_user}"* ]]; then
found=1
break
fi
done < foo.txt
# do something with $found
最後に改行文字がないファイルに興味がない場合は、確認を省略できます[[ $line ]]
。