2017-08-07 9 views
-1

ファイルの行を読み込み、解析して変数の値を割り当て、変数があらかじめ定義された文字列と一致した場合に動作します。私は「#!/ binに/ bashのを使用してそれを実行しています。ここでは、コードです。bashのループが評価されていない場合

23 for DIR in $(find . -name "H[A-Z]*" -maxdepth 1); do 
24 if $(test -d ${DIR}); then 
25  echo $(basename ${DIR}); 
26  cd $(basename ${DIR}); 
27 
28  for fname in $(find . -name "*.DAT"); do 
29  echo $(basename $fname); 
30  calType=$(grep 'Level_Unit' $fname | sed -e 's/.*=\([A-Z]\)/\1/'); 
31  echo $(basename $calType); 
32   if [ "$calType" == FPL ] 
33   then 
34   echo "This is a keeper " $calType; 
35   fi 
36  done 
37  cd ../ 
38 
39 fi; 
40 
41 done 

私はここに私の端末に出力をダンプしています私が見たものです...

sumit$ ./harp_phaseI_calfilenames.sh 
+ rm harp_Phase1_calnames1.txt 
+ touch harp_Phase1_calnames1.txt 
+ calTest=FPL 
++ find . -name 'H[A-Z]*' -maxdepth 1 
+ for DIR in '$(find . -name "H[A-Z]*" -maxdepth 1)' 
++ test -d ./HALAF032 
++ basename ./HALAF032 
+ echo HALAF032 
HALAF032 
++ basename ./HALAF032 
+ cd HALAF032 
++ find . -name '*.DAT' 
+ for fname in '$(find . -name "*.DAT")' 
++ basename ./08E21D00.DAT 
+ echo 08E21D00.DAT 
08E21D00.DAT 
++ grep Level_Unit ./08E21D00.DAT 
++ sed -e 's/.*=\([A-Z]\)/\1/' 
+ calType=$'V\r' 
++ basename $'V\r' 
+ echo $'V\r' 
V 
+ '[' $'V\r' == FPL ']' 
+ for fname in '$(find . -name "*.DAT")' 

Iを"calType = $ 'V \ r'に6行の出力の下からドル記号があるのがなぜ分かりません。次に、主な質問はif文が存在しない理由です私はあなたが提供したインスタンスが文字列と変数をマッチさせていないことを認識していますが、同じことを認識しています。 "#:。 $ calTypeが "FPL \ r"のときに発生します。

ありがとうございます。

ベスト、あなたはそれらをすべて処理する前に、UNIX形式にファイルを変換するために使用することができDOS2UNIX スミット

+1

コードには多くの問題があります。明らかなものを修正するためにshellcheck.netを通して実行してください。 – chepner

+0

ファイルにDOSスタイルの行終端文字が含まれているため、文字列の末尾に改行が付きます( '\ r')。文字列を 'tr -d '\ r"に通してそれを削除することができます。 –

答えて

0

あなたが尋ねる主な問題は、このステートメントに関連すると思わ:

... | sed -e 's/.*=\([A-Z]\)/\1/' 

これが何をするかは、例えば入力x=FPLjunkを与えられた、ある、それは出力FPLjunkます。 私はおおまかな推測では、大文字のままにして、行の最後に残っているものを切り捨てたいということです。 はここでそれを達成するための一つの方法です:

... | sed -e 's/.*=\([A-Z][A-Z]*\).*/\1/' 

スクリプトを使用して、他の厄介な問題が同様に存在します。 が目立つように多くを修正しましたが、すべてではありません。

shopt -s nullglob 

for DIR in "H[A-Z]*"/; do 
    echo $(basename "${DIR}") 

    for fname in $(find "$DIR" -name "*.DAT"); do 
     echo $(basename "$fname") 
     calType=$(grep 'Level_Unit' "$fname" | sed -e 's/.*=\([A-Z][A-Z]*\).*/\1/') 
     echo $(basename "$calType") 
     if [ "$calType" = FPL ] 
     then 
      echo "This is a keeper " $calType 
     fi 
    done 
done 

*.DATファイルは、ネストされたサブディレクトリにあることができる: これは私があなたのオリジナルとの違いを勉強することをお勧め 、同等のが、より最適かつ安全なのですか? そうでなければ、findコマンドを完全に取り除くと良いでしょう。 と私は外側のループのためにしました。実際に

、 これらすべてのecho sおよびbasename sは、あなたにそれほど重要ではありません と*.DATファイルはネストされたディレクトリにない場合、 その後、スクリプト全体が、ちょうどこのワンライナーに減らすことができます。

find "H[A-Z]*/" -type f -name "*.DAT" -exec grep Level_Unit + | sed -ne 's/^.*=FPL[^A-Z]*$/This is a keeper FPL/p' 
+0

ありがとうございます。私はループを閉じることで黙っています。これは、bashの使用と学習の始まりとなりました。かなり多くの答えが期待どおりに機能していました。操作のsed部分をクリーンアップすることはおそらく最も重要でした。 –

関連する問題