4

ループインしたい配列が2つあります。それらを適切に構築し、forループに入る前に、それらをエコーし​​て、すべてが配列に問題がないことを確認します。しかし、スクリプトを実行すると、エラーが出力されます。

l<=: syntax error: operand expected (error token is "<="

強力なGoogleに相談したところ、2番目の変数が不足していることがわかりましたが、前述したように、値をエコーするので、すべて問題ないようです。これがスニペットです。

#!/bin/bash
    k=0
    #this loop is just for being sure array is loaded
    while [[ $k -le ${#hitEnd[@]} ]] 
      do
      echo "hitEnd is: ${hitEnd[k]} and hitStart is: ${hitStart[k]}"
      # here outputs the values correct 
      k=$((k+1))
    done
    k=0
    for ((l=${hitStart[k]};l<=${hitEnd[k]};l++)) ; do //this is error line..
        let array[l]++      
        k=$((k+1))
done

forループの変数は正しくエコーされますが、forループは機能しません。どこが間違っていますか?

gniourf_gniourfが答えたように:

「...ある時点で、kは値$ {#hitEnd [@]}に到達します。これは、hitEnd [k]が定義されておらず、空の文字列に展開されるときです!Bang!」

つまり、エラー出力はループの先頭ではなく、kの値が配列のインデックスよりも大きい場合、配列に含まれていないインデックスを指します。

4

2 に答える 2

4

これは、ある時点で${hitEnd[k]}何も拡張されないためです(未定義です)。で同じエラーが発生し((l<=))ます。forループは次のように記述する必要があります。

k=0
for ((l=${hitStart[0]};k<${#hitEnd[@]} && l<=${hitEnd[k]};l++)); do

k配列内の定義されたフィールドに対応するインデックスを常に持つようにします${hitEnd[@]}

また、代わりに

k=$((k+1))

あなたはただ書くことができます

((++k))

終わり!

スクリプトは、より優れた最新のbashプラクティスを使用して改訂されました。

#!/bin/bash
k=0
#this loop is just for being sure array is loaded
while ((k<=${#hitEnd[@]})); do
    echo "hitEnd is: ${hitEnd[k]} and hitStart is: ${hitStart[k]}"
    # here outputs the values correct 
    ((++k))
done
k=0
for ((l=hitStart[0];k<${#hitEnd[@]} && l<=hitEnd[k];++l)); do
    ((++array[l]))
    ((++k))
done

さて、forループがあなたが望むことを正確に実行するかどうかはわかりません...代わりにこれを意味しませんか?

#!/bin/bash
# define arrays hitStart[@] and hitEnd[@]...
# define array array[@]

#this loop is just for being sure array is loaded
for ((k=0;k<${#hitEnd[@]};++k)); do
    echo "hitEnd is: ${hitEnd[k]} and hitStart is: ${hitStart[k]}"
    # here outputs the values correct 
    ((++k))
done

for ((k=0;k<${#hitEnd[@]};++k)); do
    for ((l=hitStart[k];l<=hitEnd[k];++l)); do
        ((++array[l]))
    done
done
于 2012-12-02T18:15:16.573 に答える
1

少し強引ですが、forループをwhileループに書き直します。

l="${hitStart[k]}"
while [[ "$l" -le "${hitEnd[k]}" ]]; do
        let array[l]++      
        k=$((k+1))
        l=$((l+1))
done
于 2012-12-02T18:15:23.867 に答える