tcsh shell脚本中的正则表达式

时间:2013-02-12 16:39:48

标签: regex shell tcsh

我在tcsh中有一个shell脚本,我传递一个参数,其长度可以变化。参数的可能值是字母-c,s,i,q,a。还有这些字母的组合。 (例如:cs,si,ca,iq,qa,csq,acs,csia ..etc)。字母的顺序无关紧要。 我的问题是检查除了这5个以外的任何字符的参数,并且如果任何有效字符出现多次(零时间没问题)。脚本应该检查两个条件并抛出错误。是否有任何正则表达式可以用于if语句?

2 个答案:

答案 0 :(得分:2)

以下是您可以使用的示例代码段。使用“X”是为了强制比较为字符串。

#!/bin/csh -f
if ( $#argv > 0 ) then
    echo arg is $1
    if ( X$1 =~ X-* ) then
        echo "we have an argument"
        if ( "X$1" =~ X-c[aeiou] ) then
            echo I found -c followed by vowel
        else if ( "X$1" =~ "X-c" ) then
            echo I found -c alone
        else
            echo I found a -c but not a valid combo
        endif
   else
        echo I found an unknown argument: $1
   endif
endif

答案 1 :(得分:0)

这对两个正则表达式检查最容易,一个用于检查所有字母的有效性,另一个用于查找重复的字母。

看看这段代码:

#!/bin/tcsh

echo $1 | grep -q -e "[^csqai]"
if ( $? != 0 ) then
    echo "Valid characters"
else
    echo "Invalid characters"
endif

echo $1 | grep -q -e "\([csqai]\).*\1"
if ( $? != 0 ) then
    echo "No repeated valid characters"
else
    echo "Repeated valid characters"
endif

第一个正则表达式查找所有无效的字符,第二个正则查找任何重复的字符

我不知道如何在tcsh中执行这些检查,因此我使用grep进行了检查。 -q标志使grep无声。如果找不到匹配项,则$?为0。