2014-03-19 64 views
0

我有以下bash腳本(我使用msysgit執行它)。該文件被命名爲git-open如何在bash腳本中使用正則表達式解析輸入參數?

#!/usr/bin/env bash 
tempfile=`mktemp` || exit 1 
git show $1 > $tempfile 
notepad++ -multiInst -notabbar -nosession -noPlugin $tempfile 
rm $tempfile 

我調用它通過混帳,像這樣:

git open master:Applications/Survey/Source/Controller/SurveyManager.cpp 

我在記事本中打開此之前++,我希望它的擴展追加到臨時文件,以便編輯自動應用正確的語法高亮顯示。如果沒有指定擴展名,那麼mktemp不應該添加擴展名。

我該如何修改上面的腳本來像這樣工作?我對linux腳本很少有經驗,所以我不確定如何爲此實現一個正則表達式(假定正則表達式是必需的)。

回答

2

您可以通過mktemp爲您的文件名模板。

tempfile=$(mktemp -t git-open.XXXXXXXX.${1##*.}) || exit 1 
+0

根據'$ 1'的樣子,你可以用它作爲模板:'mktemp -t「XXX。$ 1」'。 – chepner

+0

@chepner'$ 1'在我的問題中看起來像我的例子:'master:Applications/Survey/Source/Controller/SurveyManager.cpp' –

+0

哦,對。這不會作爲模板,由於正斜槓:) – chepner

1

正則表達式對此是矯枉過正。參數擴展中帶有前綴刪除的全局模式是完全足夠的。

tempfile=`mktemp`.${1##*.} 

${1##*.}表示「擴展$1但刪除文件名匹配模式*.匹配最長前綴。*匹配的一切,.比賽本身,所以這消除一切直到幷包括最後.。剩下的就是擴展。

取而代之的是##您還可以使用最長前綴#的最短前綴,%的最短後綴和%%的。

好的,你可能想要處理沒有擴展的情況。這可與case多glob模式的幫助來完成:它是否包含.;使用後綴只有當它

case ${1##*/} in 
    *.*) suffix=${1##*.};; 
    *) suffix='';; 
esac 
tempfile=`mktemp`$suffix 

這將需要的文件名沒有領先的目錄,測試。或者你可以比較擴展與原始devnull建議。