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