やりたいこと
bashのif文で、文字列の最初にドットが含まれない正規表現を条件式として使いたかった。
ファイルのリストから隠しファイル (ドットファイル) を除外したかったからである。
カレントディレクトリの状況↓
ls
.DS_Store
myfile.txt
ハマったところ
bashでは前方一致はできるが、否定先読み (前方一致の否定) は使えない1
前方一致:
file_name=$(ls)
if [[ $file_name =~ ^(\.).*$ ]];then echo $file_name; fi;
.DS_Store
否定先読み:
if [[ $file_name =~ ^(?!(/.)).*$ ]];then echo $file_name; fi;
bash: !: event not found
解決案
elseを使う方法もあるが、if内で処理を行わないので冗長になってしまう。
そこで、まずif文の条件式を前方一致にしておき、その条件式全体を!
で否定することで、擬似的に否定先読みを行った。
否定先読みの回避策:
if [[ ! $file_name =~ ^\..*$ ]];then echo $file_name; fi;
myfile.txt