シェルスクリプトの概要
シェル スクリプトとは何ですか? (Windows には同様の種類のファイルがあり、一般にバッチ ファイルと呼ばれます)
-
特定の構文に従ってシェルコマンドで構成されたプログラムファイル
シェルスクリプトって何に使うの?
バッチファイル/統合コマンド
-
ソフトウェアの起動
-
パフォーマンス監視
-
ログ分析
...
Shell コマンドの本質 (type コマンドを参照)
組み込みコマンド (起動時にすでにメモリにロードされているため、ハードディスクから再ロードする必要はありません)
gec@ubuntu:~$ type cd
cd 是 shell 内建
gec@ubuntu:~$ type pwd
pwd 是 shell 内建
外部コマンド (他の外部プログラムによって実装される)
gec@ubuntu:~$ type ifconfig
ifconfig 是 /sbin/ifconfig
ifconfig は外部アプリケーションに対応しており、実際には /sbin の下の ifconfig プログラムに対応しており、アプリケーションは次のようになります。
シェル コマンドを実行する必要がある場合、PATH 環境変数が設定されます。このパス環境変数は、外部コマンドに対応するアプリケーションが配置されているディレクトリを記録します。現在の PATH は、次のコマンドで出力できます。
gec@ubuntu:~$ echo $PATH
/home/gec/bin:/home/gec/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm/5.4.0/usr/bin
コマンドを入力すると、まず組み込みコマンドと一致するようにメモリに移動します。見つからない場合は、シェルはこれらのディレクトリに移動して、対応するアプリケーションを 1 つずつ見つけます。見つかった場合は、それを作成します。新しいプロセスを作成し、プロセス内で実行します。この新しいアプリ。
例:
gec@ubuntu:~$ sudo vi hello.c
gec@ubuntu:~$ gcc hello.c -o hello
gec@ubuntu:~$ ./hello
hello world
gec@ubuntu:~$ echo $PATH
/home/gec/bin:/home/gec/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm/5.4.0/usr/bin
gec@ubuntu:~$ sudo mv hello /usr/bin/
gec@ubuntu:~$ hello
hello world
GCC を使用してファイルをコンパイルし、hello.c
生成された実行可能ファイルをシステムの環境変数にあるディレクトリにhello
移動すると、hello は ifconfig と同様の外部コマンドになります。/usr/bin/
$PATH
こんにちはC
#include <stdio.h>
int main()
{
printf("hello world\r\n");
return 0;
}
アプリケーションはシェルに対する外部コマンドになります
コンパイル言語
シェルスクリプト言語はC言語と同じですか?
-
コンパイル済み vs インタープリタ済み: C 言語はコンパイラがソース コードをマシン コードに変換し、生成された実行可能ファイルを実行する必要があるコンパイル済み言語です。シェルスクリプト言語は、実行可能ファイルをコンパイルして生成することなく、スクリプトを 1 行ずつ解釈して実行するインタープリタ型言語です。
-
言語の使用法: C 言語は通常、システムレベルのプログラミングと低レベルの開発に使用され、メモリとハードウェア リソースを直接操作できるため、高いパフォーマンス要件とより多くのハードウェア制御要件を持つアプリケーションの開発に適しています。シェル スクリプト言語は主に自動化タスク、システム管理、およびスクリプト プログラミングに使用され、ファイル操作の処理、システム コマンドの実行、および単純なスクリプトの作成により適しています。
-
文法的特徴: C 言語には、厳密に型指定された変数宣言、複雑な制御構造、ポインターなどの概念を含む、比較的厳密な文法規則があります。シェル スクリプト言語の構文は比較的シンプルかつ柔軟で、システム コマンドの直接呼び出しとパイプラインを使用したデータ処理をサポートしています。
一般的に使用されるシェル インタプリタは何ですか?
gec@ubuntu:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
gec@ubuntu:~$ ls /bin/*sh
/bin/bash /bin/dash /bin/rbash /bin/sh /bin/static-sh
最初のシェルスクリプト
こんにちは世界
編集、保存、権限の変更、実行/デバッグ
gec@ubuntu:~$ sudo vi hello.sh
gec@ubuntu:~$ sudo chmod 777 hello.sh
gec@ubuntu:~$ sudo vi hello.sh
gec@ubuntu:~$ ./hello.sh
hello world
シェルの起動方法
-
プログラムの実行時
-
実行するインタープリタを指定します
-
ソースと 。
gec@ubuntu:~$ ./hello.sh
hello world
gec@ubuntu:~$ /bin/bash hello.sh
hello world
gec@ubuntu:~$ source hello.sh
hello world
gec@ubuntu:~$ . hello.sh
hello world
シェルスクリプトの構文説明
変数を定義する
-
variable=value は
スペースには適用されません -
variable='value' は
逆参照されず、そのまま出力されます。 -
variable="value" は
逆参照しますgec@ubuntu:~$ sudo vi test.sh gec@ubuntu:~$ ./test.sh 123 5674aaa gec@ubuntu:~$ sudo vi test.sh gec@ubuntu:~$ ./test.sh ${var}aaa
変数を使用する
-
$変数
-
${変数}
-
1 #! /bin/bash 2 3 var="123 5674" 4 var1='${var}aaa' 5 echo "$var1"
変数の値を取得するには変数の {} を忘れないでください
コマンドの結果を変数に代入します
-
変数=`コマンド`
-
変数=$(コマンド)
どちらもコマンドの結果を左側の変数に代入できます。
変数の削除
設定を解除する
#! /bin/bash
var="123 5674"
var1='${var}aaa'
unset var
echo "$var"
特殊変数
変数 | 意味 |
---|---|
$0 | 現在のスクリプトのファイル名。 |
$n(n≧1) | スクリプトまたは関数に渡される引数。nはパラメータの数を示す数字です。たとえば、最初のパラメータは $1 で、2 番目のパラメータは $2 です。 |
$# | スクリプトまたは関数に渡される引数の数。 |
$* | スクリプトまたは関数に渡されるすべてのパラメーター。 |
$@ | スクリプトまたは関数に渡されるすべてのパラメーター。$@ は、二重引用符で" " 囲まれた場合、$* とは若干異なる動作をします。 |
$? | 最後のコマンドの終了ステータス、または関数の戻り値を取得します。 |
$$ | 現在のシェルプロセス ID。シェル スクリプトの場合、これはスクリプトが存在するプロセス ID です。 |
1 #! /bin/bash
2
3 var="123 5674"
4 var1='${var}aaa'
5
6 unset var
7 echo "$var"
8 echo "$0"
9 echo "$1"
10 echo "$2"
11 echo "$#"
12 echo "$*"
13 echo "$$"
14
15
16
17 exit 123
~
gec@ubuntu:~$ ./test.sh 10 11 13 14
./test.sh
10
11
4
10 11 13 14
10870
文字列の連結
並んで
キーボードから入力されたデータを読み取る
read は scanf に似ています
1 #! /bin/bash
2
3
4 read -p "input a:" a
5 read -p "input b:" b
6 var="123 5674"
7 var1='${var}aaa'
8
9 #unset var
10 #echo "$var"
11 #echo "$0"
12 #echo "$1"
13 #echo "$2"
14 #echo "$#"
15 echo "$*"
16 #echo "$$"
17
18 echo "${a}"
19 echo "${b}"
20
21
22
23 exit 123
~
结果
gec@ubuntu:~$ ./test.sh
input a:111
input b:222
111
222
現在のプロセスを終了する
出口
整数に対して数学的演算を実行する
(())
論理的および/または
コマンド1 && コマンド2
コマンド 1 || コマンド2
&& の場合、前者は false で後者は実行されません。 || の場合、前者は true で後者は実行されません
条件が真かどうかを確認する
テスト式と[式]
オプション | 効果 |
---|---|
-eq | 値が等しいかどうかを確認する |
- は | 値が等しくないかどうかを確認する |
-gt | 値が次より大きいかどうかを判断します |
-lt | 値が以下かどうかを判断します |
-ge | 値が以下であるかどうかを判断します。 |
- | 値が以下であるかどうかを判断します。 |
-z str | 文字列 str が空かどうかを判断する |
-n str | 文字列 str が空でないかどうかを判断します。 |
= と == | 文字列 str が等しいかどうかを確認する |
-d ファイル名 | ファイルが存在するかどうか、およびそれがディレクトリ ファイルであるかどうかを確認します。 |
-f ファイル名 | ファイルが存在するかどうか、およびそれが通常のファイルであるかどうかを確認します。 |
パイプライン
コマンド1 | コマンド2
if ステートメント
if 条件 then ステートメント fi
if else ステートメント
if 条件 then ステートメント 1 else ステートメント 2 fi
if elif else ステートメント
if 条件 1 then ステートメント 1 elif 条件 2 then ステートメント 2
……elseステートメントn fi
ステートメント内のケース
パターン 1) ステートメント 1 の case 式 ;; パターン2) ステートメント2 ;; パターン3) ステートメント3 ;; …… *) esac のステートメント
for in ループ
value_list の for 変数 do ステートメントが完了しました
値リスト
-
特定の値を直接与える
-
値の範囲を与える
-
コマンドの実行結果
-
シェルのワイルドカードの使用
-
特殊な変数を使用する
while ループ
while 条件 do ステートメントが完了しました
関数
関数名() { ステートメント [戻り値] }