私は必ずしも答えを望むわけではありませんが、誰かが私にいくつかの文献や例を教えてもらえればと思います。知りたいです。
スクリプトを実行するとエラーが発生します。
予期しないタグ付近の構文エラー
fi
私はif
私の声明if
に注釈を付け、ディスプレイecho "$NAME"
を追加することによってこれを行いました/etc/
。
変更を実行して#
から削除しif
てfi
追加する#
と、 wc -c "$NAME"
上記の構文エラーが発生します。;
の間に追加しました]
。then
次の行に移動しましたが、回避策はありません。
#!/bin/bash
for NAME in /etc/*
do
if [ -r "$NAME" -af "$NAME" ] then
wc -c "$NAME"
fi
done
答え1
if
then
、、、、else
などfi
のfor
キーワードは、case
シェル内のコマンド名が必要な場所に配置する必要があります。それ以外の場合は、通常の単語として扱われます。例えば、
echo if
単に印刷すると、条件付きif
ディレクティブは開始されません。
だから行に
if [ -r "$NAME" -af "$NAME" ] then
この単語はthen
コマンドの引数です[
(実行されるとこれについて文句を言います)。シェルは検索を続け、コマンドの場所をthen
見つけます。まだ探しているものがfi
あるため、予期しないことであり、構文エラーがあります。if
then
fi
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ではない)の条件付き構成を使用します。この構造は構文的に特別であり、[
他のコマンドのように構文解析されるため、内部のようなものを使用でき、特定の文字列演算子(、、、、)の引数を&&
除いて変数を引用する必要はありません。=
==
!=
=~
いつ二重引用符が必要ですか?詳細はこちら)。
答え2
次のような変更があるかどうかを確認してください
if [-r "$NAME"-a -f「$NAME」];それから #^^^^^^ トイレ -c "$NAME" フィリピン諸島
ifブロック内のすべてのコマンドを削除するには、少なくともコロンを追加する必要があります。
if [ -r "$NAME" -a -f "$NAME" ]; then
:
fi
または一行バージョン
if [ -r "$NAME" -a -f "$NAME" ]; then :; fi