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 に答える