csh > リスト項目day,hourを用いたリストの生成 > while / shift使用 / foreach使用 / set downlist = ( $downlist $prefix$aday$ahour$postfix)

```txt:動作環境
CentOS 6.8
tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux) options wide,nls,dl,al,kan,sm,rh,color,filec
```

NCEP FNLデータを取得するとき、Web上でリスト項目をクリックしてcshスクリプトが生成される。
そのcshを使ってファイルを取得する、ということができる。

クリックを数十回するのが面倒くさいし、間違いの元だ。

cshスクリプトを変更した方が時間節約でき、失敗も少なくなるだろう。

### code v0.1 > リスト表示だけ

自動生成されるcshスクリプトが勉強材料。
以下の実装をした。

```csh_string_exec
#!/bin/csh

set filelist = ( \
  grib2/2016/2016.11/fnl_20161108_00_00.grib2 \
  grib2/2016/2016.11/fnl_20161108_06_00.grib2 \
  grib2/2016/2016.11/fnl_20161108_12_00.grib2 \
  grib2/2016/2016.11/fnl_20161108_18_00.grib2 \
)

while($#filelist > 0)
  echo "$filelist[1]"
  shift filelist
end

exit 0
```

```txt:結果
$ csh csh_string_exec 
grib2/2016/2016.11/fnl_20161108_00_00.grib2
grib2/2016/2016.11/fnl_20161108_06_00.grib2
grib2/2016/2016.11/fnl_20161108_12_00.grib2
grib2/2016/2016.11/fnl_20161108_18_00.grib2
```

### code v0.2 > day, hourループを追加

```csh_string_exec
#!/bin/csh

set answerlist = ( \
  grib2/2016/2016.11/fnl_20161108_00_00.grib2 \
  grib2/2016/2016.11/fnl_20161108_06_00.grib2 \
  grib2/2016/2016.11/fnl_20161108_12_00.grib2 \
  grib2/2016/2016.11/fnl_20161108_18_00.grib2 \
)

set hourlist = ( _00 _06 _12 _18 )
set daylist = ( 08 09 10 11 12 13 14 15 16 17 )
set prefix = "grib2/2016/2016.11/fnl_201611"
set postfix = "_00.grib2"

echo "Code:"
foreach aday ($daylist)
  foreach ahour ($hourlist)
    echo $prefix$aday$ahour$postfix
  end
end

echo "Answer:"
while($#answerlist > 0)
  echo "$answerlist[1]"
  shift answerlist
end

exit 0
```

```txt:結果
$ csh csh_string_exec
Code:
grib2/2016/2016.11/fnl_20161108_00_00.grib2
grib2/2016/2016.11/fnl_20161108_06_00.grib2
grib2/2016/2016.11/fnl_20161108_12_00.grib2
grib2/2016/2016.11/fnl_20161108_18_00.grib2
grib2/2016/2016.11/fnl_20161109_00_00.grib2
grib2/2016/2016.11/fnl_20161109_06_00.grib2
grib2/2016/2016.11/fnl_20161109_12_00.grib2
grib2/2016/2016.11/fnl_20161109_18_00.grib2
grib2/2016/2016.11/fnl_20161110_00_00.grib2
grib2/2016/2016.11/fnl_20161110_06_00.grib2
grib2/2016/2016.11/fnl_20161110_12_00.grib2
grib2/2016/2016.11/fnl_20161110_18_00.grib2
grib2/2016/2016.11/fnl_20161111_00_00.grib2
grib2/2016/2016.11/fnl_20161111_06_00.grib2
grib2/2016/2016.11/fnl_20161111_12_00.grib2
grib2/2016/2016.11/fnl_20161111_18_00.grib2
grib2/2016/2016.11/fnl_20161112_00_00.grib2
grib2/2016/2016.11/fnl_20161112_06_00.grib2
grib2/2016/2016.11/fnl_20161112_12_00.grib2
grib2/2016/2016.11/fnl_20161112_18_00.grib2
grib2/2016/2016.11/fnl_20161113_00_00.grib2
grib2/2016/2016.11/fnl_20161113_06_00.grib2
grib2/2016/2016.11/fnl_20161113_12_00.grib2
grib2/2016/2016.11/fnl_20161113_18_00.grib2
grib2/2016/2016.11/fnl_20161114_00_00.grib2
grib2/2016/2016.11/fnl_20161114_06_00.grib2
grib2/2016/2016.11/fnl_20161114_12_00.grib2
grib2/2016/2016.11/fnl_20161114_18_00.grib2
grib2/2016/2016.11/fnl_20161115_00_00.grib2
grib2/2016/2016.11/fnl_20161115_06_00.grib2
grib2/2016/2016.11/fnl_20161115_12_00.grib2
grib2/2016/2016.11/fnl_20161115_18_00.grib2
grib2/2016/2016.11/fnl_20161116_00_00.grib2
grib2/2016/2016.11/fnl_20161116_06_00.grib2
grib2/2016/2016.11/fnl_20161116_12_00.grib2
grib2/2016/2016.11/fnl_20161116_18_00.grib2
grib2/2016/2016.11/fnl_20161117_00_00.grib2
grib2/2016/2016.11/fnl_20161117_06_00.grib2
grib2/2016/2016.11/fnl_20161117_12_00.grib2
grib2/2016/2016.11/fnl_20161117_18_00.grib2
Answer:
grib2/2016/2016.11/fnl_20161108_00_00.grib2
grib2/2016/2016.11/fnl_20161108_06_00.grib2
grib2/2016/2016.11/fnl_20161108_12_00.grib2
grib2/2016/2016.11/fnl_20161108_18_00.grib2
```

### 備考

`set daylist = ( 08 09 10 11 12 13 14 15 16 17 )`
をseqなどで生成してもいいが、0パディングする方法(8の値から"08"にする方法)を知らない。
daylist手打ちでも作業負荷は少ないので、ここまでとする。

### code v0.3 downlistに格納

```csh
#!/bin/csh

set answerlist = ( \
  grib2/2016/2016.11/fnl_20161108_00_00.grib2 \
  grib2/2016/2016.11/fnl_20161108_06_00.grib2 \
  grib2/2016/2016.11/fnl_20161108_12_00.grib2 \
  grib2/2016/2016.11/fnl_20161108_18_00.grib2 \
)

set hourlist = ( _00 _06 _12 _18 )
set daylist = ( 08 09 10 11 12 13 14 15 16 17 )
set prefix = "grib2/2016/2016.11/fnl_201611"
set postfix = "_00.grib2"

set downlist = ()
foreach aday ($daylist)
  foreach ahour ($hourlist)
	set downlist = ( $downlist $prefix$aday$ahour$postfix)
  end
end

echo "Code:"
while($#downlist > 0)
  echo "$downlist[1]"
  shift downlist
end


echo "Answer:"
while($#answerlist > 0)
  echo "$answerlist[1]"
  shift answerlist
end

exit 0
```

動作結果はv0.2と同じ。
downlistに格納されるので、その後の処理がそのまま使える。


このスクリプトを使って実作業時間5分が数秒になった。
スクリプト生成時間は15分なので、3回で元が取れる。