2番目のサイクルの問題

2番目のサイクルの問題

こんにちは、次のループを実行して複数の緯度と経度にremapnnコマンドを適用できます。

era_Temperature_2016era_Temperature_2017era_Temperature_2018era_Temperature_2019era_Temperature_2020という名前のNETCDFファイルがたくさんあり、これらすべてのファイルにループを適用したいと思います。

#!/bin/bash

infile="era_temperature_2016.nc"
coords="coords.txt"

while read line
do
   line=$(echo $line | sed -e 's/\r//g')
   station=$(echo $line | cut -d ' ' -f 1)
   #-- skip header line
   if [[ "$station" == "station" ]]; then continue; fi
   #-- select station coordinates
   lat=$(echo $line | cut -d ' ' -f 2)
   lon=$(echo $line | cut -d ' ' -f 3)
   station="${station}_${lat}_${lon}"
   #-- extract the station data
   cdo -remapnn,"lon=${lon}_lat=${lat}" ${infile} ${station}_out.nc
done < $coords

以下を試しましたが、エラーが発生します。

間違い ./values1.sh:行5:coords="coords.txt"' ./values1.sh: line 5: 予期しないタグcoords = "coords.txt"'の近くに構文エラーがあります。

#!/bin/bash

my_files=$(ls era_temperature_*.nc)
for f in $my_files
coords="coords.txt"

while read line
do
   line=$(echo $line | sed -e 's/\r//g')
   station=$(echo $line | cut -d ' ' -f 1)
   #-- skip header line
   if [[ "$station" == "station" ]]; then continue; fi
   #-- select station coordinates
   lat=$(echo $line | cut -d ' ' -f 2)
   lon=$(echo $line | cut -d ' ' -f 3)
   station="${station}_${lat}_${lon}"
   #-- extract the station data
   cdo -remapnn,"lon=${lon}_lat=${lat}" ${infile} ${station}_out.nc
done < $coords

皆様のご意見・ご協力ありがとうございます

以下のコードはうまくいきます

#!/bin/bash

for NUM in $(seq 2016 2018)
do
infile=era_temperature_$NUM.nc
coords="coords.txt"

while read line
do
   line=$(echo $line | sed -e 's/\r//g')
   station=$(echo $line | cut -d ' ' -f 1)
   #-- skip header line
   if [[ "$station" == "station" ]]; then continue; fi
   #-- select station coordinates
   lat=$(echo $line | cut -d ' ' -f 2)
   lon=$(echo $line | cut -d ' ' -f 3)
   station="${station}_${NUM}_${lat}_${lon}"
   #-- extract the station data
   cdo -remapnn,"lon=${lon}_lat=${lat}" ${infile} ${station}_out.nc
done < $coords
done 

ベストアンサー1

Bashforループで、次の構文に従ってください。

for <variable name> in <a list of items> ; do <some command> ; done

それを分析しましょう。

for配列を繰り返すことをシェルに通知します。

<variable name>現在反復している配列の項目を保存する場所をシェルに提供します。

in <a list of items>繰り返す配列を指定します。

;スクリプト内のセミコロンまたは実際の改行文字である可能性がある改行文字を指定します。

do <some command>はループで実行したいコマンドで、以前にforループで定義されていた変数を含めることができますが、必ずしもそうではありません。

;今回はループ終了を準備するために改行します。

doneこれでループが閉じます。

したがって、for f in $my_files追加した内容から、後に改行文字があることがわかりますが、シェルがdo期待したaを定義するのではなく、シェルが予期しない変数を定義しました。シェルは、これが起こるとは思わないため、構文エラーメッセージで終了します。doneループしたいコードの終わりにも終端はありません。ループwhileには終端がありますが、doneループには終端はありませんfor

また、次のことを検討してください。lsの解析を避ける。問題が発生する可能性があります。ファイルの繰り返しなどの簡単な操作の場合は、以下を削除すると同じ操作を簡単に実行できますls

thegs@wk-thegs-01:test$ ls 
test1.txt  test2.txt  test3.txt
thegs@wk-thegs-01:test$ for file in test*.txt ; do echo $file ; done
test1.txt
test2.txt
test3.txt

続行する前にループ構文を調べることも悪くありません。 Redhatは以下を提供します。アクセシビリティ文書Bashのループについては、読書を強くお勧めします(残念ながら構文解析しますlsが、完璧な人はいません)。

おすすめ記事