2012-10-02 87 views
0

我可以用正则表达式成功使用正则表达式for循环?

$ cat while.sh 
#!/bin/sh 
arr=(a1c a2c a3c b4c) 
i=0 
while [[ ${arr[i]} =~ a(.)c ]] 
do 
    echo ${BASH_REMATCH[1]} 
    ((i++)) 
done 

$ ./while.sh 
1 
2 
3 

for循环运行while循环会导致此错误

$ cat for.sh 
#!/bin/sh 
arr=(a1c a2c a3c b4c) 
for ((i=0; [[ ${arr[i]} =~ a(.)c ]]; i++)) 
do 
    echo ${BASH_REMATCH[1]} 
done 

$ ./for.sh 
./for.sh: line 3: ((: [[ a1c =~ a(.)c ]]: syntax error: operand expected (error 
token is "[[ a1c =~ a(.)c ]]") 

回答

2

我不知道你for循环结构是法律与正则表达式。双括号表示Arithmetic表达式,并包含for循环。正则表达式匹配不是算术。我想,如果你真的使用for出于某种原因设置,你就必须这样做:

arr=(a1c a2c a3c b4c) 

for val in "${arr[@]}"; do 
    if [[ $val =~ a(.)c ]]; then 
     echo ${BASH_REMATCH[1]} 
    fi 
done 
+0

实际上,该语法对于for循环是有效的:'for((i = 0; i <5; i ++));做echo $ i;完成' – mikebabcock

+0

我知道,因为'我<5'是一个算术表达式。他的正则表达式不是。编辑我的答案,使其更清楚我的意思是,这是不是一个有效的构造,他有,而不是一般。 – Mitzimoto

+1

他需要的是$?来自'[[evaluation]]'的价值,而不是它的结果,但是在他的版本中,只要评估是错误的,循环就会退出。假设他的意思是这样。 – mikebabcock

3

要跟进我的评论上面,如果你想保留您的格式,或多或少,这可能会做你所期望的,因为你需要评估的返回值作为for循环中的表达式,而不是它的输出。

for ((i=0; `[[ ${arr[i]} =~ a(.)c ]] && echo -n 1`; i++)); do 
    # do whatever 
done 

丑,但为我工作,并应为你解释你的错误。 back-ticks评估表达式,然后输出'1'为true或不输出false。这给你留下了中间循环的有效条件。