2015-06-21 39 views
3

假設我有一個包含文件名的日期列表。我想對特定日期的擴展名爲pngjpg的文件做些什麼。我有以下代碼:在if語句中使用大括號擴展

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

這似乎不起作用,沒有文件通過條件。我可以通過使用兩個條件並使用or條件來完成;但我想知道我做錯了什麼。 Brace擴展應該工作,否則我應該如何使用它。

回答

2

{...}不擴展爲if的條件。您可以使用extglob

shopt -s extglob 

[[ $f = *"$year"[email protected](png|jpg) ]] && echo "$f" 

你可能甚至不需要一個for循環與extglob,你可以這樣做:

printf "%s\n" *"$year"[email protected](png|jpg) 
+0

我之前不知道這一點,它很酷。你在哪裏我可以得到更多關於'shopt'選項的信息我試過男人,沒有出現。我可以通過不提供任何參數來看到其他選項,儘管我不知道它們的意思。你也知道一種方法來打開其他選項,例如'autocd'來進行所有未來登錄,除了將它添加到'.bashrc'嗎? – user14492

+2

您可以通過'help shopt'和'shopt'來查看shell中設置了哪些選項。 – anubhava

1

您也可以使用參數擴展/子串提取建設測試還有:

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

注: 0123簡單地將附加到測試的兩側以避免檢查空字符串(例如,而不是"${f##*${year}.jpg}" = ""

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 
+0

'(\ .png | \ .jpg)'可以縮寫爲'\。(png | jpg)'。 (甚至是'\。(pn | jp)g',但這有點傻)。 – Biffen

+0

@Biffen那麼'$ ext'將包含'png'而不是'.png'。爲了方便,我希望它是'.png',並且注意'(\ .png | \ .jpg)'是一個捕獲的組。 – Jahid

+0

公平點。 '(\。(png | jpg))'可能是妥協。或'ext =「。$ {BASH_REMATCH [3]}」'☺ – Biffen