Linux の基礎とアプリケーション開発シリーズ 1: シェル スクリプト プログラミング

シェルスクリプトの概要

シェル スクリプトとは何ですか? (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 ステートメントが完了しました

関数

関数名() { ステートメント [戻り値] }

おすすめ

転載: blog.csdn.net/qq_51519091/article/details/132067514