1.シェルスクリプト
1.1 定義と目的
シェルスクリプトとは、シェルコマンドで構成されるスクリプトプログラムです。シェルは、ユーザーがコマンドを入力できるユーザー インターフェイスを提供するコマンド インタープリタです。コマンドは、シェルによる実行のためにオペレーティング システムに送信されます。シェル スクリプトは、システム管理タスク、ファイル操作、プログラム実行などのタスクを自動化するために広く使用されています。
1.2 シェルスクリプトの作成と実行
シェル スクリプトを作成するには、実行するコマンドを含むテキスト ファイルを作成するだけです。このファイルは、vi、nano、emacs などのテキスト エディタを使用して作成できます。次に、このファイルを.sh
ファイルとして保存します。たとえば、myscript.sh
。
シェル スクリプトを実行する最も一般的な方法は、コマンド ラインにsh myscript.sh
または を入力することですbash myscript.sh
。ただし、実行する前に、スクリプトに実行権限があることを確認する必要があります。実行権限は をchmod +x myscript.sh
介して追加できます。
1.3 シェルスクリプトの基本構造
基本的なシェル スクリプトには次の部分が含まれます。
-
スクリプトの先頭 (シバン): これは、「#!」で始まり、その後にこのスクリプトを解釈するシェルへのパスが続く行です。たとえば、
#!/bin/bash
このスクリプトは bash で実行する必要があることを意味します。 -
コメント: シェル スクリプトでは、行の先頭にあり、その後に「!」 (つまりシバン) が続く場合を除き、「#」記号以降はすべてコメントとみなされます。
-
コマンドとステートメント: これはシェル スクリプトの主要部分であり、実行されるすべてのコマンドとステートメントが含まれています。
1.4 例: 単純なシェル スクリプトの例
簡単なシェル スクリプトの例を次に示します。
#!/bin/bash
# 这是一个简单的shell脚本
echo "Hello, World!"
このスクリプトは「Hello, World!」を出力します。
1.5 シェルスクリプトの制御構造
シェル スクリプトは、条件ステートメントやループなどのさまざまな制御構造を提供します。
-
条件文: if や case など。以下は if ステートメントの例です。
#!/bin/bash if [ "$1" = "Hello" ] then echo "Hello, how are you ?" else echo "Sorry, I do not understand" fi
このスクリプトは、最初のコマンド ライン引数が「Hello」かどうかを確認し、そうであれば「こんにちは、お元気ですか?」を出力し、そうでない場合は「申し訳ありません、わかりません」を出力します。
-
ループ: for および while など。以下は for ループの例です。
#!/bin/bash for NAME in John Paul Ringo George do echo "Hello, $NAME!" done
このスクリプトは、「こんにちは、ジョン!」、「こんにちは、ポール!」、「こんにちは、リンゴ!」、「こんにちは、ジョージ!」を順番に出力します。
2. シェル変数
2.1 シェル変数の定義
シェルでは、変数は値を格納するために使用される名前であり、数値、文字、文字列、ファイルへのパスなどを指定できます。シェル変数は、スクリプトを作成するときに非常に便利で、異なる場所で同じ値を使用したり、スクリプトの実行中にこれらの値を動的に変更したりすることができます。
2.2 シェル変数の作成と使用
シェルでは、スペースを含まない一連の文字に値を代入して変数を作成します。たとえば、次のコマンドは というVAR
名前の変数を作成し、それに値を割り当てますHello World
。
VAR="Hello World"
この変数を使用するには、変数名の前にドル記号 ($) を付ける必要があります。たとえば、次のコマンドは次のように出力しますHello World
。
echo $VAR
2.3 シェル変数の種類
シェルには、次の 3 つの主なタイプの変数があります。
-
ローカル変数: ローカル変数は、それが定義されているシェル スクリプト内で有効です。ローカル変数がスクリプト内で定義されている場合、その変数はスクリプト内でのみ使用できます。
-
環境変数: 環境変数はシステム環境全体に対して有効です。シェル スクリプトで環境変数を定義すると、この変数を他のシェル スクリプトで使用できます。
-
位置引数変数: これらの変数は、コマンド ラインでスクリプトに渡される引数です。これらには $1、$2、$3 などの名前が付けられ、$1 が最初のパラメータ、$2 が 2 番目のパラメータというようになります。
2.4 特殊なシェル変数 (例: $?、$$)
シェルには、すべてのシェル スクリプトで特定の意味を持つ特別な変数もいくつか用意されています。
-
$?
: この変数は、最後に実行されたコマンドの終了ステータスを保存します。コマンドが正常に実行された場合、この変数の値は 0 になります。それ以外の場合、この変数の値はゼロ以外になります。 -
$$
: この変数は、現在のシェル スクリプトのプロセス ID を保存します。
2.5 例:シェル変数の使用例
以下はシェル変数を使用した例です。
#!/bin/bash
NAME="John Doe"
echo "Hello, $NAME!"
AGE=25
echo "$NAME is $AGE years old."
INPUT=$1
echo "The input argument is $INPUT."
echo "This script's PID is $$."
echo "The exit status of the last command was $?."
このスクリプトは、最初に 2 つのローカル変数を定義してNAME
から、AGE
それらを使用します。その後、スクリプトは位置引数変数を使用し$1
、最後にスクリプト自体のプロセス ID と最後に実行されたコマンドの終了ステータスを出力します。
3. 変数とスクリプト間の相互作用
3.1 スクリプトでの変数の使用
シェル スクリプトでは、変数はプログラミングの重要な部分です。変数を使用すると、データを保存および操作できるため、スクリプトがより柔軟で動的になります。
スクリプトで変数を使用する基本的な方法は、コマンド ラインで行うのと同じように、コマンドまたはステートメント内に変数を配置することです。例えば:
#!/bin/bash
GREETING="Hello, World!"
echo $GREETING
この例では、まず変数を作成しGREETING
、次にecho
コマンドを使用してその値を出力します。次の例のように、変数を文字列内で直接使用することもできます。
#!/bin/bash
NAME="John"
echo "Hello, $NAME"
このスクリプトは「こんにちは、ジョン」を出力します。
もう 1 つの例は、変数を使用して複数のファイルをループで処理することです。
#!/bin/bash
for FILE in *.txt
do
mv "$FILE" "${FILE%.txt}.bak"
done
このスクリプトは、現在のディレクトリ内のすべてのファイルの.txt
名前を.bak
files に変更します。
3.2 コマンドラインを介してスクリプトに変数を渡す
シェル スクリプトを実行する場合、コマンド ラインを介してスクリプトに変数を渡すことができます。これらの変数は、それぞれ $1、$2、$3 などの位置パラメーター変数と呼ばれます。$1 は最初のパラメーターを表し、$2 は 2 番目のパラメーターを表します。
たとえば、次のスクリプトは最初と 2 番目の引数を出力します。
#!/bin/bash
echo "The first argument is $1"
echo "The second argument is $2"
./myscript.sh Hello World
このスクリプトを実行すると、次のように出力されます。
The first argument is Hello
The second argument is World
特殊変数 sum を使用してすべてのパラメータを取得する$@
こともできます$*
。どちらもすべての引数をリストとして扱いますが、二重引用符内では"$@"
各引数を個別の文字列として、"$*"
すべての引数を個別の文字列として扱います。
さらに、$#
変数を使用してパラメータの数を取得することもできます。
コマンド ライン引数を使用すると、スクリプトがより柔軟になり、さまざまなコンテキストで使用しやすくなります。
4. シェルスクリプトと変数の高度なトピック
4.1 シェル関数
シェル関数は再利用可能なコード ブロックであり、スクリプト内の任意の場所で関数名によって呼び出すことができます。シェル関数を定義するための基本的な構文は次のとおりです。
function_name () {
commands
}
たとえば、次のように挨拶を出力する関数を定義できます。
greeting() {
echo "Hello, $1"
}
# 调用函数
greeting "World"
この関数は 1 つのパラメータ ( $1
) を受け取り、「Hello, $1」を出力します。これを呼び出すとgreeting "World"
、「Hello, World」と出力されます。
関数はパラメータを受け取ったり返したりできるため、複雑なスクリプトを作成する場合に非常に役立ちます。関数のパラメータには位置変数$1
(など) を$2
介してアクセスし、戻り値return
はコマンドを介して返されます。
4.2 シェルスクリプトのデバッグ
デバッグはプログラミングの重要な部分であり、コード内のエラーを見つけて修正するのに役立ちます。シェル スクリプトでは、デバッグを支援するためにいくつかの組み込みオプションとコマンドを使用できます。
スクリプトの実行時にオプションを使用できます-x
。これにより、スクリプト内の各コマンド ラインとその結果が出力されますbash -x myscript.sh
。
スクリプト内で、set -x
と を使用してset +x
デバッグのオンとオフを切り替えることができます。デバッグをオンにすると、シェルは実行されたすべてのコマンドとその結果を出力します。
さらに、set -e
オプションを使用すると、エラーが発生したときにスクリプトをただちに終了できるため、エラーの蓄積や伝播を防ぐことができます。
4.3 シェルのサブシェルと変数スコープ
シェルでスクリプトまたはコマンドを実行すると、通常はサブシェルと呼ばれる新しいシェル インスタンスで実行されます。子シェルは親シェルの環境を継承しますが、子シェルで行われた変更(変数の変更など)は親シェルには影響しません。
これは変数のスコープに関係します。シェル スクリプトでは、変数のスコープは、変数が定義されているシェル インスタンスに制限されます。これは、シェル スクリプト (またはサブシェル) で変数を定義すると、その変数はそのスクリプト (またはサブシェル) でのみ表示されることを意味します。
ただし、export
このコマンドを使用して、サブシェルで使用できる環境変数を作成できます。例えば:
#!/bin/bash
export VAR="Hello, World!"
bash -c 'echo $VAR'
この例では、まず環境変数をエクスポートし、次にその値をVAR
サブシェル ( ) に出力します。bash -c
これは環境変数であるためVAR
、サブシェルで表示されます。
これらのスコープ規則を覚えておくことは、シェル スクリプトを作成して理解するときに非常に重要です。