for file in "$1"/*
do
if [ ! -d "${file}" ] ; then
if [[ $file == *.c ]]
then
blah
blah
上面的代码遍历目录中的所有.c文件并执行一些操作。我想要包含.cpp,.h,.cc文件。如何检查同一条件中的多个文件扩展名?
由于
答案 0 :(得分:3)
您可以使用布尔运算符组合条件:
if [[ "$file" == *.c ]] || [[ "$file" == *.cpp ]] || [[ "$file" == *.h ]] || [[ "$file" == *.cc ]]; then
#...
fi
另一种选择是使用正则表达式:
if [[ "$file" =~ \.(c|cpp|h|cc)$ ]]; then
#...
fi
答案 1 :(得分:3)
为什么不迭代选定的文件扩展名?
#!/bin/bash
for file in ${1}/*.[ch] ${1}/*.cc ${1}/*.cpp; do
if [ -f $file ]; then
# action for the file
echo $file
fi
done
答案 2 :(得分:3)
使用扩展模式,
# Only necessary prior to bash 4.1; since then,
# extglob is temporarily turn on for the pattern argument to !=
# and =/== inside [[ ... ]]
shopt -s extglob nullglob
for file in "$1"/*; do
if [[ -f $file && $file = *.@(c|cc|cpp|h) ]]; then
...
fi
done
扩展模式也可以生成文件列表;在这种情况下,肯定需要shopt
命令:
shopt -s extglob nullglob
for file in "$1"/*.@(c|cc|cpp|h); do
...
done