2016-05-26 13 views
0

は、私は以下のようにbashスクリプトを持っている:基本的に私はNCO ncksコマンドを使用して、各年の時間ディメンションを抽出しようとしていますバッシュスクリプト - ネステッド・ループ誤った値をとる

day=(58 34 107 91 43 39 41 76 37 47 70 74 56 19 95 38 48 96 50 76 89 79 46 105 26 88 69 87 23 82 99 77 114 52 87 63 33 52 57 45 48 49 55 60 34 107 48 40 25 20 16) 

year=(1952 1953 1954 1955 1956 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004) 

for dom in $day; do 
    for yrs in $year; do 
      ncks -O -d time,$dom imdJJAS$yrs.nc ac_$yrs.nc 
    done 
done 

、スクリプトが実行されても出力間違っています。 1951年には、58番目の時間値が正常に抽出されましたが、1952年以降は、日配列(16)の最後の値が抽出されますが、これは正しくありません。

iveは、その配列から設定しようとしましたが、これを使用すると、すべての年の間、配列の最後の値が抽出されます。

私は間違って何をしているのか分かりませんが、iveはこれに関してかなりの投稿を見ましたが、それはうまくいくようです。

すべての助けをお願いします。

乾杯!

答えて

0

私はあなたの意図を正しく理解していれば、両方のアレイから対応する値を使用しようとしています。その場合、数値インデックスが必要です。 for VAR in ARRAYは配列のすべての値に対して反復処理を行います。

+0

うわー、誰かがコメントなしであなたをdownvoted。彼らが何とそっちに動いたのか – SaintHax

+0

ええ、その不公平@MichealVehrs あなたの質問に答えるために、はい、確かに私の意図です。 –

1

$arrayはそれ自身で配列の最初の要素に展開されます。完全な配列に展開するには、あなたは${array[@]}を使用する必要があります。

for dom in "${day[@]}"; do 
    for yrs in "${year[@]}"; do 
      ncks -O -d "time,${dom}" "imdJJAS${yrs}.nc" "ac_${yrs}.nc" 
    done 
done 

私はまた、あなたの変数の展開を引用し、${dom}${yrs}$dom$yrsを変更しました。後で定義されていない変数を誤って参照することを防ぐために行われます$dom_abc${dom}_abcと同じではありません

+0

こんにちはandlrc、 ありがとう、本当にありがとうございます。 私は上記のようにあなたのコードを試しましたが、$ {dom}の日配列の最後の要素しか使われていないようです。 年の配列が正しく選択されているように見えますが、問題は "$ day [@]}"の domです。コマンドを実行します。 私はそれが何であるか知りません。私の日の配列を見て、それが間違っていることはありません。私は見ることができます –

+0

私は私の年にエラーを見つけましたが、iveは1966を追加するのを忘れました。 それぞれの長さ配列は正しくなりましたが、配列の最後の値が他のすべての曜日の値を上書きしているように見えます。 –

+0

@KarlChanあなたは 'dom'変数をどこで参照していますか?反復の外に? – andlrc