如何在bash脚本中使用正则表达式解析输入参数?

时间:2014-03-19 18:12:43

标签: regex git bash

我有以下bash脚本(我使用msysgit执行它)。该文件名为git-open

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

我通过git调用它:

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

在我用notepad ++打开它之前,我希望它将扩展名附加到临时文件,以便编辑器自动应用正确的语法高亮显示。如果没有指定扩展名,那么mktemp不应该添加扩展名。

如何修改上面的脚本才能像这样工作?我对linux脚本的经验很少,所以我不确定如何为此实现正则表达式(假设正则表达式是必要的)。

2 个答案:

答案 0 :(得分:2)

您可以为您的文件名传递mktemp模板。

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

答案 1 :(得分:1)

正则表达式对此有些过分。参数扩展中的全局模式与前缀删除完全足够。

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

${1##*.}表示"展开$1,但删除与通配模式*.匹配的最长前缀。 *匹配所有内容,.匹配自身,因此会删除所有内容,包括最后.。剩下的就是扩展。

您可以使用##代替#代替最短的前缀,%代替最短的后缀,%%代替最长的前缀。

好的,你可能想要处理没有扩展的情况。这可以在case和更多glob模式的帮助下完成:

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

这将采用不带前导目录的文件名,测试它是否包含.并仅在有后缀的情况下使用。或者你可以将扩展与devnull暗示的原始扩展进行比较。