識別子を宣言する必要があります。 [閉じる]

識別子を宣言する必要があります。 [閉じる]

私の作品:

   filename='somefile_Connectivity_12345.CSV'
   trimfilename= echo $filename| cut -d'_' -f 2
   if '$trimfilename'='Connectivity'
   then 
   echo "loop1"
   elif '$trimfilename'='Red'
   then 
echo " loop2"
elif ' $trimfilename'='Blue'
then
echo "loop3'
end if;

「識別子を宣言する必要があります。elif部分がない場合は正しく機能します」というエラーが発生します。

答え1

この試み:

#!/bin/bash
filename='somefile_Connectivity_12345.CSV'
trimfilename=$(echo $filename| cut -d'_' -f 2)
if [ $trimfilename = "Connectivity" ]
then 
  echo "loop1"
elif [ $trimfilename = "Red" ]
then 
  echo " loop2"
elif [ $trimfilename = "Blue" ]
then
  echo "loop3"
fi

答え2

デフォルトでは、次の場合は '$trimfilename' を 'Connectivity' に設定しようとします。

if '$trimfilename'='Connectivity'...

if- 指揮位置にいるとき - はいいいえechoexit同じ意味を持つコマンドです[。これは予約語;- と同じ方法でシェルのパーサによって処理され、<newline>- 実際にも! dammit同じ方法で処理されます。=

ifif少なくとも 1 つのブロックで構成されるブロックの開始を示します。複合コマンド、1、または簡単なコマンド。おそらく私が説明できる最も有用な方法は次のとおりです。

#one compound command
{ simple command; simple command; simple command; } 

if { : this compound command returns 0 ; }
then { : do this compound command ; }
else { : do this compound command ; }
fi

それぞれの間の中括弧予約語 ifthen;elseそして暗黙的にifブロックにあり、不要です。しかし、これはすべてシェルのパーサーによって処理されます。

解析が発生します今後変数の拡張/割り当てを実行するとき:

if var=val
then :
else :
fi

...テスト中です。仕事~の到着変わりやすい0(この場合は返される値)を返し、そこから続けます。しかし、...これを行うと...

if 'in\valid var name'=val
then :
else :
fi

...その後運が良ければエラーメッセージが表示され、elseブロックが完了します。ただし、ブロック全体の実行が突然停止する可能性が最も高いです。解析できません。

前述のように、=この割り当て演算子はシェルパーサーの関数なので、完了するには少なくとも2つの評価が必要です。

var=val; eval $var=val2

シェルは=解析時に(拡張前)割り当て機能を記録し、拡張の割り当てを処理できません。まだこのようなことが起こっていないからです。

必要なのはテストコマンドの戻り値です。明らかに変数拡張を評価するコマンドです。これはtest...

if test "$var" = "val"
then echo yay
else echo nay
fi

または...

if [ "$var" = "val" ]
then echo yay
else echo nay
fi

"quote"testコマンドは、あまりにも多くの場所であまりにも多くのパラメータしか処理できないため、これはテストされた拡張に重要です。後ろにシェルの解析とシェル拡張が間もなく提供されます。噴射。

関連情報