Linux シェル (1)

シェルの概要

シェルというのは、コマンドラインインタープリタ、アプリケーション/ユーザー コマンドを受け取り、オペレーティング システム カーネルを呼び出します。

シェルは非常に強力なプログラミング言語でもあります。書きやすく、デバッグしやすく、柔軟性がある

ここに画像の説明を挿入します

Linuxが提供するシェルパーサー

[guozihan@hadoop100 ~]$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

bash と sh の関係

-rwxr-xr-x。1 ルート root 964536 2021 年 11 月 25 日 bash
lrwxrwxrwx。1 root root 10 8月25日 20:20 bashbug -> bashbug-64
-rwxr-xr-x。1 root root 6964 11月 25 2021 bashbug-64
lrwxrwxrwx. 1 root root 4 8月25日 20:20 sh -> bash

Centos のデフォルトのパーサーは bash です

[guozihan@hadoop100 bin]$ echo $SHELL
/bin/bash

シェルスクリプトの入門

スクリプト形式

スクリプトは ==#!/bin/bash== で始まります (パーサーを指定します)

最初のスクリプト

要件: helloworld を出力するシェル スクリプトを作成する

  • 実践例

    まずフォルダープログラムを作成し、次にフォルダー内にshファイルを作成し、vimで編集します。

    [guozihan@hadoop100 デスクトップ]$ mkdir プログラム

    [guozihan@hadoop100 デスクトップ]$ cd プログラム/

    [guozihan@hadoop100 プログラム]$ touch helloword.sh

    [guozihan@hadoop100 プログラム]$ vim helloword.sh

    #!/bin/bash
    echo "helloworld"
    

よく使用されるスクリプトの実行方法

  • bash または sh+ スクリプトの相対パスまたは絶対パスを使用します (スクリプトに +x 権限を与える必要はありません

    sh+script への相対パス

    [guozihan@hadoop100 プログラム]$ sh ./helloworld.sh
    helloworld

    sh+scriptへの絶対パス

    [guozihan@hadoop100 プログラム]$ sh /home/guozihan/Desktop/program/helloworld.sh
    helloworld

    bash+スクリプトへの相対パス

    [guozihan@hadoop100 プログラム]$ bash ./helloworld.sh
    helloworld

    bash+スクリプトへの相対パス

    [guozihan@hadoop100プログラム]$ bash /home/guozihan/桌面/program/helloworld.sh
    helloworld

  • 入力スクリプトの絶対パスまたは相対パスを使用してスクリプトを実行します(実行権限 +x が必要です

    ①まず、helloworld.sh スクリプトに +x 権限を付与します。

    [guozihan@hadoop100 プログラム]$ chmod +x helloworld.sh

    ②スクリプトを実行する

    [guozihan@hadoop100 プログラム]$ ./helloworld.sh
    helloworld

    [guozihan@hadoop100プログラム]$ /home/guozihan/桌面/program/helloworld.sh
    helloworld

注: 最初の実行方法では、基本的に bash パーサーがスクリプトを実行できるようにするため、スクリプト自体には実行権限は必要ありません。2 番目の実行方法は基本的に、スクリプトが次のことを行う必要があることを意味します。

実行するため実行権限が必要です。

  • スクリプトのパスの前に「.」またはソースを追加します。

    ①既存ファイルtest.sh、内容は以下の通り

    #!/bin/bash

    A=5

    エコー $A

    ②sh、bash、./、.を使用してそれぞれ実行すると以下のようになります。

    [guozihan@hadoop100 プログラム]$ bash test.sh
    5

    [guozihan@hadoop100 プログラム]$ sh test.sh
    5

    [guozihan@hadoop100 プログラム]$ chmod +x test.sh

    [guozihan@hadoop100 プログラム]$ ./test.sh
    5

    [guozihan@hadoop100 プログラム]$ . テスト.sh
    5

理由:

最初の 2 つのメソッドは、現在のシェルでサブシェルを開いてスクリプト コンテンツを実行します。スクリプト コンテンツが終了すると、サブシェルは閉じて親シェルに戻ります。

3 番目の方法は、スクリプト パスの前に「.」またはソースを追加することで、サブシェルを開かずにスクリプトの内容を現在のシェルで実行できるようにします。これが、/etc/profile ファイルを変更するたびにソースを作成する必要がある理由です。

サブシェルを開く場合と開かない場合の違いは、サブシェルに設定されている現在の変数などの環境変数の継承関係が親シェルには表示されないことです。

変数

システムの事前定義変数

  • よく使用されるシステム変数

    $HOME、$PWD、$SHELL、$USER 等

  • 事例演習

    システム変数の値を表示する

    [guozihan@hadoop100 ~]$ echo $HOME
    /home/guozihan

    現在のシェル内のすべての変数を表示します: set

    [guozihan@hadoop100 ~]$セット

カスタム変数

  • 基本的な文法

    (1) 変数の定義:変数名 = 変数値、注意点、 =数字の前後にスペースを入れてはなりません

    (2) 変数の設定を解除:変数の設定を解除する名前

    (3) 静的変数を宣言します: 読み取り専用変数、注意:設定を解除できません

  • 変数定義ルール

    (1)変数名は文字、数字、アンダースコアで構成できますが、数字で始めることはできません、環境変数名は大文字にすることをお勧めします。

    (2)等号の両側にスペースを入れることはできません

    (3)bash では、変数のデフォルトの型はすべて文字列型であり、数値演算を直接実行することはできません。

    (4)変数の値にスペースが含まれる場合は、二重引用符または一重引用符で囲む必要があります。

  • 事例演習

    変数Aを定義する

    [guozihan@hadoop100 ~]$ A=5

    [guozihan@hadoop100 ~]$ echo $A
    5

    変数 A に値を再代入する

    [guozihan@hadoop100 ~]$ A=8

    [guozihan@hadoop100 ~]$ echo $A
    8

    変数 A を元に戻す

    [guozihan@hadoop100 ~]$ 設定解除 A

    [guozihan@hadoop100 ~]$ echo $A

    静的変数 B=2 を宣言していますが、設定を解除できません

    [guozihan@hadoop100 ~]$ 読み取り専用 B=2

    [guozihan@hadoop100 ~]$ echo $B
    2

    [guozihan@hadoop100 ~]$ B=9
    -bash: B: 読み取り専用変数

    bash では、変数のデフォルトの型はすべて文字列型であり、数値演算を直接実行することはできません。

    [guozihan@hadoop100 ~]$ C=1+2

    [guozihan@hadoop100 ~]$ echo $C
    1+2

    変数の値にスペースが含まれる場合は、二重引用符または一重引用符で囲む必要があります。

    [guozihan@hadoop100 ~]$ D=スンチェンバッシュが大好きです
    : 愛: コマンドが見つかりません…

    [guozihan@hadoop100 ~]$ D=「スンチェンが大好きです」

    [guozihan@hadoop100 ~]$ echo $D
    スンチェンが大好きです

    変数はグローバル環境変数に昇格でき、他のシェル プログラムで使用できます。

    エクスポート変数

    helloworld.sh ファイルに echo $B を追加

    #!/bin/bash 
    
    echo "helloworld" 
    echo $B
    

    [guozihan@hadoop100 プログラム]$ ./helloworld.sh
    helloworld

    [guozihan@hadoop100 プログラム]$ エクスポート B

    [guozihan@hadoop100 プログラム]$ ./helloworld.sh
    helloworld
    2

特殊変数

$n

  • 基本的な文法

    $n関数の説明: n は数値、$0 はスクリプト名、$1 ~ $9 は最初から 9 番目のパラメーターを表し、10 を超えるパラメーターは中括弧で囲む必要があります (${10} など)

  • 事例演習

    [guozihan@hadoop100 プログラム]$ touch パラメータ.sh

    [guozihan@hadoop100 プログラム]$ vim パラメータ.sh

    #!/bin/bash
    echo '=$n='
    echo $0
    echo $1
    echo $
    

    [guozihan@hadoop100 プログラム]$ chmod 777 パラメータ.sh

    [guozihan@hadoop100 プログラム]$ ./parameter.sh cls xz
    =$n=
    ./parameter.sh
    cls
    xz

$#

  • 基本的な文法

    $#関数の説明: すべての入力パラメーターの数を取得します。パラメーターの数が正しいかどうかを判断し、スクリプトの堅牢性を高めるためにループでよく使用されます。

  • 実践例

    [guozihan@hadoop100 プログラム]$ vim パラメータ.sh

    #!/bin/bash
    echo '==========$n=========='
    echo $0
    echo $1
    echo $2
    echo '==========$#=========='
    echo $
    

    [guozihan@hadoop100 プログラム]$ chmod 777 パラメータ.sh

    [guozihan@hadoop100 プログラム]$ ./parameter.sh cls xz
    =$n=
    ./parameter.sh
    cls
    xz
    =$n=
    2

$*、$@

  • 基本的な文法

    $*関数の説明: この変数はコマンド ラインのすべてのパラメータを表します。$* はすべてのパラメータを全体として扱います。

    $@関数の説明: この変数はコマンドラインのすべてのパラメータも表しますが、$@ は各パラメータを別々に扱います。

  • 事例演習

    [guozihan@hadoop100 プログラム]$ vim パラメータ.sh

    #!/bin/bash
    echo '==========$n=========='
    echo $0
    echo $1
    echo $2
    echo '==========$#=========='
    echo $#
    echo '==========$*=========='
    echo $*
    echo '==========$@=========='
    echo $@
    

    [guozihan@hadoop100 プログラム]$ ./parameter.sh abcdefg
    =$n=
    ./parameter.sh
    a
    b
    =$n=
    7
    =$n=
    abcdefg
    =$n=
    abcdefg

$?

  • 基本的な文法

    $?機能の説明: 最後に実行されたコマンドのステータスを返します。この変数の値が 0 の場合は、前のコマンドが正しく実行されたことが証明され、この変数の値が 0 以外の場合 (特定の数値はコマンド自体によって決定されます)、前のコマンドが正しく実行されなかったことが証明されます。 。

  • 事例演習

    helloworld.sh スクリプトが正しく実行されているかどうかを確認します。

    [guozihan@hadoop100 プログラム]$ ./helloworld.sh
    helloworld

    [guozihan@hadoop100 プログラム]$ echo $?
    0

オペレーター

  • 基本的な文法

    「$((演算式))」または「$[演算式]」

  • 事例演習

    (2+3)*4の値を計算します

    [guozihan@hadoop100 プログラム]$ S=$[(2+3)*4]

    [guozihan@hadoop100 プログラム]$ echo $S
    20

条件判断

  • 基本的な文法

    (1)試験条件

    (2) [条件] (条件の前後にスペースが必要であることに注意してください)

    注: 条件が空でない場合、それは true を意味し、[guozihan] は true を返し、[] は false を返します。

  • 共通の判定条件

    • 2 つの整数を比較する

      -eq 等しい (等しい)

      -ne は等しくない (等しくない)

      -lt 未満 (未満)

      -le より小さい (より小さい)

      -gt より大きい (より大きい)

      -ge より大きい等しい

      注: 文字列間の比較の場合、等号を判断するには等号「=」を使用し、不等号を判断するには「!=」を使用します。

    • ファイル権限に基づいて決定する

      -r には読み取り権限があります (読み取り)

      -w には書き込み権限があります (書き込み)

      -x には実行権限があります (実行)

    • ファイルの種類で判断する

      -e ファイルが存在します

      -f ファイルは存在し、通常のファイルです

      -d ファイルは存在し、ディレクトリです

  • 事例演習

    23 は 22 以上ですか?

    [guozihan@hadoop100 プログラム]$ [ 23 -ge 22 ]

    [guozihan@hadoop100 プログラム]$ echo $?
    0

    helloworld.sh には書き込み権限がありますか?

    [guozihan@hadoop100 プログラム]$ [ -w helloworld.sh ]

    [guozihan@hadoop100 プログラム]$ echo $?

    0

    /home/atguigu/cls.txt ディレクトリにファイルは存在しますか?

    [guozihan@hadoop100 プログラム]$ [ -e /home/guozihan/cls.txt ]

    [guozihan@hadoop100 プログラム]$ echo $?
    1

    複数条件判定( && は、前のコマンドの実行が成功した場合にのみ次のコマンドが実行されることを意味します。 || は、前のコマンドの実行が失敗した場合にのみ次のコマンドが実行されることを意味します)

    [guozihan@hadoop100 プログラム]$ [guozihan ] && エコー OK || エコーしない
    OK OK

    [ guozihan@hadoop100 プログラム ] $ [ ] && エコー OK || エコー notOK
    notOK

プロセス制御(▲)

判断があれば

  • 基本的な文法

    • 単一の分岐

      if [ 条件判断式 ];then
      	程序
      fi
      

      または

      if [ 条件判断式 ]
      then
      程序
      fi
      
    • 複数の支店

      if [ 条件判断式 ]
      then
      	程序
      elif [ 条件判断式 ]
      then
      	程序
      else
      	程序
      fi
      

    予防:

    ①[条件判定式]、角括弧と条件判定式の間にはスペースが必要です。

    ②ifの後にはスペースが必要です

  • 事例演習

    数値を入力します。1の場合はbanzhang zhen shuaiを出力、2の場合はcls zhen meiを出力、その他の場合は何も出力しません。

    [guozihan@hadoop100 program]$ touch if.sh
    [guozihan@hadoop100 program]$ vim if.sh
    
    #!/bin/bash
    if [ $1 -eq 1 ]
    then
    echo "banzhang zhen shuai"
    elif [ $1 -eq 2 ]
    then
    echo "cls zhen mei"
    fi
    
    [guozihan@hadoop100 program]$ chmod 777 if.sh
    [guozihan@hadoop100 program]$ ./if.sh 1
    banzhang zhen shuai
    [guozihan@hadoop100 program]$ ./if.sh 2
    cls zhen mei
    

ケースステートメント

  • 基本的な文法

    case $変数名 in

    「値1」)

    変数の値が値 1 に等しい場合、プログラム 1 を実行します

    ;;

    「値2」)

    変数の値が値 2 と等しい場合、プログラム 2 を実行します

    ;;

    …他の分岐は省略…

    *)

    変数の値が上記の値ではない場合、このプログラムを実行します

    ;;

    イーサック

    予防:

    (1) ケース行の終わりは単語「in」である必要があり、各パターン一致は右括弧「)」で終わる必要があります。

    (2) 二重セミコロン「;;」はコマンド シーケンスの終了を示し、Java のブレークに相当します。

    (3) 最後の「*)」はデフォルトのモードを示し、java と同等です。

  • 事例演習

    数値を入力し、1の場合はbanzhangを出力し、2の場合はclsを出力し、それ以外の場合はrenyaoを出力します。

    [guozihan@hadoop100 program]$ touch case.sh
    [guozihan@hadoop100 program]$ vim case.sh
    
    #!/bin/bash
    case $1 in
    "1")
    echo "banzhang"
    ;;
    "2")
    echo "cls"
    ;;
    *)
    echo "renyao"
    ;;
    esac
    
    [guozihan@hadoop100 program]$ chmod 777 case.sh 
    [guozihan@hadoop100 program]$ ./case.sh 
    renyao
    [guozihan@hadoop100 program]$ ./case.sh 1
    banzhang
    
    

for ループ

  • 基本文法1

    for (( 初始值;循环控制条件;变量变化 ))
    do
    	程序
    done
    
  • 事例演習1

    1から100まで足す

    [guozihan@hadoop100 program]$ touch for1.sh
    [guozihan@hadoop100 program]$ vim for1.sh 
    
    #!/bin/bash
    sum=0
    for((i=0;i<=100;i++))
    do
    sum=$[$sum+$i]
    done
    echo $sum
    
    [guozihan@hadoop100 program]$ chmod 777 for1.sh 
    [guozihan@hadoop100 program]$ ./for1.sh 
    5050
    
  • 基本文法2

    for 变量 in123do
    程序
    done
    
  • 事例演習 2

    すべての入力パラメータを出力します

    [guozihan@hadoop100 program]$ touch for2.sh
    [guozihan@hadoop100 program]$ vim for2.sh 
    
    #!/bin/bash
    #打印数字
    for i in cls mly wls
    do
    echo "ban zhang love $i"
    done
    
    [guozihan@hadoop100 program]$ chmod 777 for2.sh 
    [guozihan@hadoop100 program]$ ./for2.sh 
    ban zhang love cls
    ban zhang love mly
    ban zhang love wls
    
  • $* と $@ の違い

    $* と $@ は両方とも、関数またはスクリプトに渡されるすべてのパラメータを表します, 二重引用符 "" で囲まれていない場合、すべてのパラメーターは $1 $2...$n の形式で出力されます。

    二重引用符 "" で囲まれている場合、 $* はすべてのパラメーターを "$1 $2...$n" の形式でまとめて出力し、 $@ は各パラメーターを "$1" "$2" の形式で区切ります。 ..すべてのパラメータを「$n」の形式で出力します

while ループ

  • 基本的な文法

    while [ 条件判断式 ]
    do
    程序
    done
    
  • 事例演習

    1から100まで足す

    [guozihan@hadoop100 program]$ touch while.sh
    [guozihan@hadoop100 program]$ vim while.sh 
    
    #!/bin/bash
    sum=0
    i=1
    while [ $i -le 100 ]
    do
    sum=$[$sum+$i]
    i=$[$i+1]
    done
    echo $sum
    
    [guozihan@hadoop100 program]$ chmod 777 while.sh 
    [guozihan@hadoop100 program]$ ./while.sh 
    5050
    

read コンソール入力を読み取ります

  • 基本的な文法

    読み取り (オプション) (パラメータ)

    ①オプション:

    -p: 値を読み取るときのプロンプトを指定します。

    -t: 値を読み込む際の待ち時間(秒)を指定します -tを付けないと永久に待つことになります。

    ②パラメータ

    変数: 値を読み取る変数名を指定します。

  • 事例演習

    7 秒以内に、コンソールに入力された名前を読み上げます。

    [guozihan@hadoop100 program]$ touch read.sh
    [guozihan@hadoop100 program]$ vim read.sh 
    
    #!/bin/bash
    read -t 7 -p "Enter your name in 7 seconds :" NN
    echo $NN
    
    [guozihan@hadoop100 program]$ chmod 777 read.sh 
    [guozihan@hadoop100 program]$ ./read.sh 
    Enter your name in 7 senconds:guozihan
    guozihan
    

おすすめ

転載: blog.csdn.net/pipihan21/article/details/132580049