在if语句中使用大括号扩展

时间:2015-06-21 06:31:10

标签: bash shell

我们说我的日期中有一个包含文件名的列表。我想对具有特定日期的扩展名 png jpg 的文件执行某些操作。我有以下代码:

year="2015"
for f in $myFiles
do
    if [[ $f = *"$year"{".png",".jpg"} ]]
    then
        echo $f
    fi
done

这似乎不起作用,没有文件通过该条件。我可以通过使用两个条件并使用or条件来完成它;但我想知道我做错了什么。支撑扩展应该有效,否则我应该如何使用它。

3 个答案:

答案 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}})