1. 概要

私たちの多くは、 bash スクリプトで感嘆符(!)を見たことがあると思います。 感嘆符は、使用されている場所に応じて、異なる目的を果たします。 これはBashシェルの強力な機能の1つであり、生産性の向上に役立ちます。

このチュートリアルでは、Bashでの感嘆符のさまざまな使用法を確認します。

2. インタプリタパスの指定

Bashでは、感嘆符(!)がポンド(#)記号とともに使用され、インタプリタパスを指定します。この使用法は「 shebang 」と呼ばれ、次のように表されます。

#!interpreter [arguments]

シェルスクリプトでは、これを使用してbashをインタープリターとして指定できます。

$ cat welcome.sh
#!/usr/bin/bash
echo "Welcome !!!"

同様に、Pythonスクリプトのディレクティブでこれを使用して、python実行可能ファイルをインタープリターとして指定できます。

$ cat welcome.py
#!/usr/bin/python
print("Welcome !!!")

このディレクティブはスクリプトの最初の行でなければならないことに注意してください。

3. コマンドの終了ステータスの反転

感嘆符(!)を使用して、コマンドの終了ステータスを反転できます。ゼロ以外のステータスを返すコマンドを実行してみましょう。

$ ls non-existing-file.txt
ls: cannot access 'non-existing-file.txt': No such file or directory
$ echo $?
2

次に、戻りステータスを反転しましょう。

$ ! ls non-existing-file.txt
ls: cannot access 'non-existing-file.txt': No such file or directory
$ echo $?
0

次に、ゼロのステータスコードを返すコマンドを実行してみましょう。

$ echo 'Hello, World'
Hello, World
$ echo $?
0

そして、その戻りステータスをゼロ以外に反転します。

$ ! echo 'Hello, World'
Hello, World
$ echo $?
1

感嘆符(!)とコマンドの間にスペースがあることに注意してください。

4. 履歴からのコマンドの実行

Bashは、現在のセッションで実行されたコマンドの履歴を保持します。 感嘆符(!)を使用して、履歴から特定のコマンドを実行できます。

4.1. 前のコマンドを実行します

!! を使用して、前のコマンドを実行できます。

$ echo 'Hello, World'
Hello, World
$ !!
echo 'Hello, World'
Hello, World

4.2. N thコマンドを実行します

!n 構文を使用して、履歴からn thコマンドを実行できます。 この式で、nは履歴からのコマンド番号を表します。 history コマンドを使用して、履歴からコマンドを一覧表示できます。

$ history
...
...
...
124 echo 'Hello, World'
125 history

124 thコマンドを実行してみましょう。

$ !124
echo 'Hello, World'
Hello, World

4.3. 特定の文字列で始まるコマンドを実行する

!string 構文を使用して、指定されたstringで始まる履歴からコマンドを実行できます。 echoで始まるコマンドを実行してみましょう。

$ !echo
echo 'Hello, World'
Hello, World

5. 歴史からの議論を参照する

感嘆符(!)を使用して、以前に実行されたコマンドの引数を参照できます。

5.1. N th引数を参照してください

!: n を使用して、以前に実行されたコマンドからn th引数を参照できます。

$ echo one two three four
one two three four
$ echo !:2
echo two
two

5.2. 最初の引数を参照してください

!:^ を使用して、以前に実行されたコマンドの最初の引数を参照できます。

$ echo one two three four
one two three four
$ echo !:^
echo one
one

5.3. 最後の引数を参照してください

!:$ を使用して、前に実行したコマンドの最後の引数を参照できます。

$ echo one two three four
one two three four
$ echo !:$
echo four
four

5.4. すべての引数を参照してください

!:* を使用して、以前に実行されたコマンドのすべての引数を参照できます。

$ echo one two three four
one two three four
$ echo !:*
echo one two three four
one two three four

6. 失敗動作での終了のオーバーライド

コマンドの実行に失敗するとすぐにスクリプトの実行を停止するようにBashを構成できます。 これは、set-eオプションを有効にすることで実現できます。

ただし、特定の障害を無視できるという要件がある場合があります。 このような場合、感嘆符(!)を使用して、障害時の終了動作をオーバーライドできます

$ cat ignore-failure.sh 
#!/bin/bash
set -e
ls non-existing-file.txt
echo "Previous command's failure has been ignored."

スクリプトを実行して、結果を確認してみましょう。

$ chmod +x ignore-failure.sh
$ ./ignore-failure.sh 
ls: cannot access 'non-existing-file.txt': No such file or directory
Previous command's failure has been ignored.

7. 結論

このチュートリアルでは、Bashでの感嘆符(!)の使用を示すさまざまな実用的な例について説明しました。 これらのコマンドを日常生活で使用して、生産性を向上させることができます。