多くの場合、コマンドラインで複数のコマンドを順番に並べるなどの単純な複合コマンドが使用されます。このようなコマンドは、コマンドの終わりを定義するセミコロンで区切られます。単純な一連のシェルコマンドを1行で作成するには、次のようにセミコロンを使用して各コマンドを区切るだけです。
command1 ; command2 ; command3 ; command4 ;
Enterキーを押すと最後のコマンドが終了するため、最後のセミコロンを追加する必要はありませんが、一貫性を保つために追加しても問題ありません。
Linuxターミナル
- Linux用の上位7つのターミナルエミュレータ
- Linuxでのデータ分析のための10個のコマンドラインツール
- 今すぐダウンロード:SSHチートシート
- 高度なLinuxコマンドのチートシート
- Linuxコマンドラインチュートリアル
エラーが発生しない限り、すべてのコマンドは問題なく実行されます。しかし、エラーが発生した場合はどうなりますか? &&を使用して、エラーを予測し、許容することができます および|| Bashに組み込まれている制御演算子。これらの2つの制御演算子は、フロー制御を提供し、コード実行シーケンスを変更できるようにします。セミコロンと改行 文字もBash制御演算子と見なされます。
&& オペレーターは、「command1が成功した場合は、command2を実行してください」と言うだけです。 command1が何らかの理由で失敗した場合、command2は実行されません。その構文は次のようになります:
command1 && command2
これが機能するのは、すべてのコマンドが、実行中に正常に完了したか失敗したかを示すコードをシェルに返すためです。慣例により、0(ゼロ)の戻りコード(RC)は成功を示し、正の数はある種の失敗を示します。一部のシステム管理者ツールは、障害を示すために1を返すだけですが、多くのツールは、他の正の数値コードを使用して障害のタイプを示します。
Bashシェルの$? 変数は、スクリプト、コマンドリストの次のコマンド、またはシステム管理者が直接チェックすることもできます。 RCを見てみましょう。簡単なコマンドを実行してすぐにRCを確認できます。これは、最後に実行されたコマンドに常に関係します。
[student@studentvm1 ~]$ ll ; echo "RC = $?"
total 284
-rw-rw-r-- 1 student student 130 Sep 15 16:21 ascii-program.sh
drwxrwxr-x 2 student student 4096 Nov 10 11:09 bin
<snip>
drwxr-xr-x. 2 student student 4096 Aug 18 10:21 Videos
RC = 0
[student@studentvm1 ~]$
このRCは0です。これは、コマンドが正常に完了したことを意味します。次に、権限がないディレクトリで同じコマンドを試してください。
[student@studentvm1 ~]$ ll /root ; echo "RC = $?"
ls: cannot open directory '/root': Permission denied
RC = 2
[student@studentvm1 ~]$
このRCの意味は、 lsにあります。 コマンドのマニュアルページ。
&&を試してみましょう コマンドラインプログラムで使用される可能性のある制御演算子。簡単なことから始めましょう。新しいディレクトリを作成し、それが成功した場合は、その中に新しいファイルを作成します。
他のディレクトリを作成できるディレクトリが必要です。まず、テストを実行できる一時ディレクトリをホームディレクトリに作成します。
[student@studentvm1 ~]$ cd ; mkdir testdir
〜/ testdirに新しいディレクトリを作成します 、作成したばかりなので空になっているはずです。次に、その新しいディレクトリに新しい空のファイルを作成します。次のコマンドはそれらのタスクを実行します。
[student@studentvm1 ~]$ mkdir ~/testdir/testdir2 && touch ~/testdir/testdir2/testfile1
[student@studentvm1 ~]$ ll ~/testdir/testdir2/
total 0
-rw-rw-r-- 1 student student 0 Nov 12 14:13 testfile1
[student@studentvm1 ~]$
testdir が原因で、すべてが正常に機能したことがわかります。 ディレクトリはアクセス可能で書き込み可能です。 testdirの権限を変更します そのため、ユーザーは学生にアクセスできなくなります。 次のように:
[student@studentvm1 ~]$ chmod 076 testdir ; ll | grep testdir
d---rwxrw-. 3 student student 4096 Nov 12 14:13 testdir
[student@studentvm1 ~]$
grepを使用する 長いリストの後のコマンド( ll ) testdirのリストを表示します 。ユーザーが学生であることがわかります testdirにアクセスできなくなりました ディレクトリ。次に、以前とほぼ同じコマンドを実行しますが、コマンドを変更して、 testdir内に別のディレクトリ名を作成します。 。
[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1
mkdir: cannot create directory ‘/home/student/testdir/testdir3’: Permission denied
[student@studentvm1 ~]$
エラーメッセージが表示されましたが、 &&を使用しています コントロールオペレーターはタッチを防ぎます testdir3 の作成中にエラーが発生したため、コマンドの実行が停止されました 。このタイプのコマンドライン論理フロー制御は、エラーが複雑になり、実際に混乱するのを防ぐことができます。しかし、もう少し複雑にしましょう。
|| 制御演算子を使用すると、最初のプログラムステートメントがゼロより大きいコードを返したときに実行される別のコマンドを追加できます。
[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1 || echo "An error occurred while creating the directory."
mkdir: cannot create directory ‘/home/student/testdir/testdir3’: Permission denied
An error occurred while creating the directory.
[student@studentvm1 ~]$
&&を使用する場合、フロー制御を使用する複合コマンド構文はこの一般的な形式を取ります および|| 制御演算子:
preceding commands ; command1 && command2 || command3 ; following commands
制御演算子を使用する複合コマンドの前後には、フロー制御セクションのコマンドに関連する可能性があるが、フロー制御の影響を受けない他のコマンドを続けることができます。これらのコマンドはすべて、フロー制御複合コマンド内で行われるものに関係なく実行されます。
これらのフロー制御オペレーターは、決定を処理し、問題が発生したときに通知することで、コマンドラインでの作業をより効率的にすることができます。スクリプトだけでなく、コマンドラインでも直接使用しています。
rootユーザーとしてクリーンアップして、ディレクトリとその内容を削除できます。
[root@studentvm1 ~]# rm -rf /home/student/testdir
Bash制御演算子をどのように使用しますか?コメントセクションでお知らせください。