2012-10-02 7 views
0

내가 루프에 대한 정규식 성공적으로regex를 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 

A를 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 ++)); do echo $ i; done' – mikebabcock

+0

'i <5'는 산술 표현식이기 때문에 알고 있습니다. 중간에있는 그의 정규 표현식은 그렇지 않습니다. 내 대답을 편집하여 더 명확하게 나타 냈습니다. 일반적으로 유효한 방식이 아니라 올바른 방식으로 구성되었음을 의미했습니다. – Mitzimoto

+1

그가 필요한 것은 $입니까? 값은 결과가 아닌'[[evaluation]]에서 얻을 수 있지만 그의 버전에서는 평가가 거짓이 되 자마자 루프가 종료됩니다. 그는 그것이 사실이라고 생각한다고 가정합니다. – mikebabcock

3

위 내 댓글에 후속하려면, 당신은 당신의 서식을 유지하기를 원한다면, 더 많거나 적은, 이것은 당신이 기대 한대로 할 수 있습니다. 왜냐하면 평가의 반환 값이 for 루프의 표현식이 아니라 출력물의 출력이 필요하기 때문입니다.

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

미안하지만 나를 위해 일했고 오류를 설명해야합니다. 백 틱은 표현식을 평가 한 후 true의 경우 '1'을, false의 경우는 출력하지 않습니다. 이렇게하면 가운데에있는 루프의 유효한 조건부가 유지됩니다.

관련 문제