使用正则表达式for for循环?

时间:2012-10-02 02:50:29

标签: regex bash loops

我可以使用正则表达式成功运行while循环

$ 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循环导致此错误

$ 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 个答案:

答案 0 :(得分:3)

要对上面的评论进行跟进,如果你想保持格式化,或多或少,这可能会达到你的预期,因为你需要将评估的返回值作为for循环中的表达式,而不是它的输出。

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

丑陋,但为我工作,应该为你解释你的错误。反向标记评估表达式,然后输出“1”表示“真”,或输出任何表示“假”。这将为您提供中间循环的有效条件。

答案 1 :(得分: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