"else"の後にある"fi"に構文エラーがあります。

"else"の後にある"fi"に構文エラーがあります。

シェルスクリプトを実行しようとすると、次のエラーが発生します。

エラー:行13:予期しないトークン「fi」の近くに構文エラーがあります。

スクリプトは次のとおりです。

case $# in
0) echo Usage is: $0 filename [filename]
  exit;;
*);;
esac

for i in $*
do
   if test -f $i;
   then
      echo $i
      cat $i
   else
fi
done

なぜエラーが発生するのですか?

答え1

Healyがすでに述べたように、bashシェルスクリプト(非常に似ています)は、and、または、または、および対応ifするelseものelifを受け入れません。 (これは次のように要約されます。各条件は次のとおりです。fielseeliffiする何。 )

ステートメントを削除するか、else後で必要に応じてelseブロック内にダミーコマンドを配置できます。たとえば、スクリプトを次のように書き換えることができます。

case $# in
0) echo Usage is: $0 filename [filename]
  exit;;
*);;
esac

for i in $*
do
   if test -f $i;
   then
      echo $i
      cat $i
   else
      true
   fi
done

(私にも合うようにインデントしましたfiifスタイルの問題ですが個人的にはこのように読むのがより簡単だと思います。)

true唯一の目的は正常な終了状態を返すことですが、コマンドなので、名前が単純ファイル$itest -f)を参照しない限り、このスクリプトは何もしません。

答え2

空のコマンドは許可されていないため、そのelse行を削除してください。

関連情報