私はセミコロンがプログラムを区別するために使用されることを読んだ。
$ echo 3; ls -la
if
これは、then
とelse
がここに別のプログラムであることを意味しますか?
$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
この質問はセミコロンとは関係ありません。
答え1
別の;
声明(ゆるく言うと)。;
aを改行文字に置き換えることは(ほぼ)常に可能です。
;
したがって、2つのプログラムを分離して「プログラム」でif
なければならないと言うのは、then
ステートメントが予約語、シェル関数、組み込みおよび外部ユーティリティ、パイプおよびブール演算子の使用などの組み合わせで構成される可能性があるため、少し過度に単純化されました。など。
どちらも予約語if
ですthen
シェル構文、「プログラム」ではありません。ここでは、技術的に呼び出されるものを構築するために使用されます。複合コマンド。
echo
これはシェルに組み込まれたユーティリティであるかもしれませんが(必ずしもそうではありません)、ls
外部ユーティリティ(または言う「プログラム」)です。
答え2
これがシェルの使い方の基本を学び始めるときの公平な最初の近似であるのに対し、「これがプログラムを実行する方法です」と「これが1行に1つずつ実行する方法です」の間には大きな違いがあります。 「プログラム」レベルでは実際にはそうではありません。
初心者がマスターするのは難しいですが、より正確な説明は、シェル言語が次のようになることです。コンピュータ言語。持っている通事論。この文法にはさまざまな内容が含まれます。語彙要素改行文字、演算子、単語、予約語などが含まれます。
if
、、、、すべてthen
else
fi
予約語。特別な意味があるとき分析するに応じて、シェルに入力が与えられます。文法。同様に;
区切り記号です。オペレーター。
したがって、シェル言語の入力は全体的にコンピュータプログラムであり、説明した他のプログラムを通じて通訳、シェル。様々な文法部分はプログラムではありません。シェル言語は、シェルが実行する(他の)プログラムを指定する方法です。
[
シェル構文の特殊語彙要素(演算子など)ではありません。これは普通のことだ言葉、そのようなプログラムの1つを指定します[
。多くの殻に組み込みこのプログラムバージョンはシェルプログラム自体のコードに統合されていますが、外部プログラム/bin/[
と同じどこかにあるプログラムにこの名前を使用してください。/usr/bin/[
外のシェルを呼び出すことができます。同様に、]
特別なシェル語彙要素でもありません。これは[
プログラムのパラメータとなる一般的な単語です。プログラム[
は実行時に最終引数を必要とし、引き続き]
それを無視します。
あなたの質問に言及されているもう一つの同様のプログラムはですecho
。繰り返しますが、ほとんどのシェルにはこのプログラムの組み込みバージョンがあります。ただし、繰り返しますが、プログラムのよう/bin/echo
なプログラムの外部バージョンがあります。/usr/bin/echo
外の呼び出すシェルです。
あなたの質問で指定された3番目のプログラムはです。 Shellには通常、ls
このプログラムの組み込みバージョンはありません。/bin/ls
/usr/bin/ls
Bourne Againシェルの場合は、次のことができます。シェルの基本機能GNU Bourne Again シェル情報文書。もちろん、他のシェルには異なる構文があります。これシングル Unix 仕様すべてのPOSIX互換シェル(POSIX互換モード)が準拠する必要がある構文を説明します。
追加読書
答え3
if
実際には、外部プログラムとして考えるのがあまりにもthen
無理ではありません。実際、Thompsonシェルはもともとelse
Unixバージョン1の外部プログラムif
として実装されました。goto
これは、サブプロセスがシェルプロセスとファイル記述子を共有するために可能です。したがって、(配信された)gotoはターゲットラベルを見つけ、終了するまで入力を読み取ります。バラよりトンプソンシェル。
答え4
if
、およびはelif
、複合コマンドと呼ばれるシェルの構成の1つを実装するために使用される予約キーワードです。これは、これらの名前のコマンド(または他のコマンド)がシェルに存在できないことを意味します。通常の目的は、コマンドを分離するのではなく、コマンドを終了することです。then
fi
;
リスト。たとえば、以下は有効なif
説明です。
if echo foo; echo bar; echo baz; then echo done; echo really done; fi
ステートメントの条件if
はコマンドのリストですecho foo; echo bar; echo baz
。パーサーは、then
セミコロンの後に続く内容が予約語であるため、コマンドになることができないため、条件が終了したことを知っています。従ってそれは何を知っているか。次のように then
体の始まりです。繰り返しますが、fi
予約されたキーワードなので、ステートメント本文の3番目のコマンドにすることはできませんが、複合if
コマンドの終わりを表示します。