我们说我的日期中有一个包含文件名的列表。我想对具有特定日期的扩展名 png 或 jpg 的文件执行某些操作。我有以下代码:
year="2015"
for f in $myFiles
do
if [[ $f = *"$year"{".png",".jpg"} ]]
then
echo $f
fi
done
这似乎不起作用,没有文件通过该条件。我可以通过使用两个条件并使用or
条件来完成它;但我想知道我做错了什么。支撑扩展应该有效,否则我应该如何使用它。
答案 0 :(得分:2)
{...}
不会针对if
条件展开。您可以使用extglob
:
shopt -s extglob
[[ $f = *"$year".@(png|jpg) ]] && echo "$f"
您甚至可能不需要extglob
的for循环,您可以这样做:
printf "%s\n" *"$year".@(png|jpg)
答案 1 :(得分:2)
您可以使用Bash正则表达式匹配:
pat="(.*)($year)(\.png|\.jpg)"
...
if [[ $f =~ $pat ]]
示例:
year="2015"
pat="(.*)($year)(\.png|\.jpg)"
for f in $myFiles
do
if [[ $f =~ $pat ]]
then
ext="${BASH_REMATCH[3]}" # This is the extension, .png or .jpg
# Additionally ${BASH_REMATCH[1]} is the part before $year in $f.
echo "$f" "$ext"
fi
done
答案 2 :(得分:1)
您还可以使用参数扩展/子字符串提取来构建测试:
x
注意: "${f##*${year}.jpg}" = ""
只是附加到测试的两边,以避免检查空字符串(例如,而不是{{1}})