他のファイルで実行されるcdoコマンドのbashスクリプト

他のファイルで実行されるcdoコマンドのbashスクリプト

私はUNIXを初めて使用しており、CLI(Climate Data Operator)「remapbil」コマンドを適用してグリッド(投影から地理座標系へ)を変換したいと思います。次のコマンドを使用すると、単一のファイル1つで完全に機能します。

cdo remapbil,target.grd hurs_EUR-11_ICHEC-EC-EARTH_rcp26_r3i1p1_DMI-HIRHAM5_v1_day_20360101-20401231.nc hurs_36_40_bil.nc

ただし、さまざまなファイルに対してこれを行う必要があります。このため、ディレクトリ内のすべてのファイルに対してremapbilコマンドを実行できる次のbashシェルを作成してみました。

#!/bin/bash

for i in *.nc;
do
echo $i
for file in "ls *.nc"; do
cdo remapbil,target.grd tas_EUR-11_ICHEC-EC-EARTH_rcp45_r3i1p1_DMI-HIRHAM5_v1_day_20210101-20251231.nc > tas_$i_bil.nc
done
done

ただし、常に次のエラーが発生します。

cdo remapbil (Abort): Too few streams specified! Operator needs 1 input and 1 output streams.

たぶん誰かが私を助けることができると思います。それではいいと思います。

ベストアンサー1

for file in "ls *.nc"; do . . . ; doneコマンドはリテラルパラメータを使用して一度実行されますls *.nc。次のように確認できます。

$ ls *.nc
bar.nc  foo.nc
$ for file in "ls *.nc"; do echo "$file" ; done
ls *.nc

あなたはおそらくコマンドの置き換え二重引用符の代わりにバックティックを使用してください。しかし、これは悪い考えです。1であり、ファイルを繰り返すために既に(引用されている場合は安全な)シェルglobを使用しているため、必要ありません。だから:

for i in *.nc;
do
echo $i
cdo remapbil,target.grd  "$i" > "tas_${i}_bil.nc"
done

出力ファイルから拡張子を削除して置き換えるには、"tas_${i}_bil.nc"次のように変更できます。"tas_${i%.nc}_bil.nc"


  1. なぜいいえ分析ls

おすすめ記事