0

我可以用正则表达式成功运行一个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 ]]")
4

2 回答 2

4

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

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

丑陋,但对我有用,应该为你解释你的错误。反引号对表达式求值,然后输出“1”表示真或不输出任何假。这为您留下了中间循环的有效条件。

于 2012-10-02T03:58:24.810 回答
2

我不确定您的for循环构造在正则表达式中是否合法。双括号用于算术表达式,包括 for 循环。正则表达式匹配不是算术。我认为,如果您for出于某种原因真的打算使用,则必须执行以下操作:

arr=(a1c a2c a3c b4c)

for val in "${arr[@]}"; do
    if [[ $val =~ a(.)c ]]; then
        echo ${BASH_REMATCH[1]}
    fi
done  
于 2012-10-02T03:44:11.197 回答