予期しないタグ「fi」の近くに構文エラーがあります。

予期しないタグ「fi」の近くに構文エラーがあります。

私は必ずしも答えを望むわけではありませんが、誰かが私にいくつかの文献や例を教えてもらえればと思います。知りたいです。

スクリプトを実行するとエラーが発生します。

予期しないタグ付近の構文エラーfi

私はif私の声明ifに注釈を付け、ディスプレイecho "$NAME"を追加することによってこれを行いました/etc/

変更を実行して#から削除しiffi追加する#と、 wc -c "$NAME"上記の構文エラーが発生します。;の間に追加しました]then次の行に移動しましたが、回避策はありません。

#!/bin/bash
for NAME in /etc/*
do

     if [ -r "$NAME" -af "$NAME" ] then
          wc -c "$NAME"
     fi
done

ベストアンサー1

ifthen、、、、elseなどfiforキーワードは、caseシェル内のコマンド名が必要な場所に配置する必要があります。それ以外の場合は、通常の単語として扱われます。例えば、

echo if

単に印刷すると、条件付きifディレクティブは開始されません。

だから行に

if [ -r "$NAME" -af "$NAME" ] then

この単語はthenコマンドの引数です[(実行されるとこれについて文句を言います)。シェルは検索を続け、コマンドの場所をthen見つけます。まだ探しているものがfiあるため、予期しないことであり、構文エラーがあります。ifthenfi

thenキーワードとして認識されるように、コマンドターミネーターを前に置く必要があります。最も一般的なコマンドターミネーターは改行文字ですが、それ以前はthen通常セミコロン(改行文字と同じ意味を持つ)が使用されていました。

if [ -r "$NAME" -af "$NAME" ]; then

または

if [ -r "$NAME" -af "$NAME" ]
then

[問題を解決すると、コマンドがコマンドを理解できないため、別のエラーが発生します-af。おそらくあなたは意味

if [ -r "$NAME" -a -f "$NAME" ]; then

テストコマンドはオプションのように見えますが、このようにまとめることはできません。これらは[コマンドの演算子であり、それぞれは別々の単語でなければなりません(例えば、do[])。

ところで、[ -r "$NAME" -a -f "$NAME" ]可能であれば文章を書くことをお勧めします

[ -r "$NAME" ] && [ -f "$NAME" ]

または

[[ -r $NAME && -f $NAME ]]

このコマンドは演算子とオペランドを簡単に区別できないため、[ … ]条件を単純に保つのが最善です。演算子のように見え、その演算子が有効な場所にある場合は、[演算子として解析できます。$NAMEこの回答に示されている単純なケースではこれは発生しませんが、より複雑な場合は危険です。この問題は、このコードを個別に記述し、[シェルの論理演算子を使用して回避できます。

2番目の構文は、[[ … ]]bash(およびkshとzsh、通常のshではない)の条件付き構成を使用します。この構造は構文的に特別であり、[他のコマンドのように構文解析されるため、内部のようなものを使用でき、特定の文字列演算子(、、、、)の引数を&&除いて変数を引用する必要はありません。===!==~いつ二重引用符が必要ですか?詳細はこちら)。

おすすめ記事