Linux shellスクリプトの関数Functionの詳細

7738 ワード

Linux shellスクリプトの関数Function

  • 関数詳細
  • 関数構文
  • 関数のライフサイクル
  • 関数戻り値
  • 関数パラメータ
  • 変数作用域
  • 1、ローカル変数
  • 2、局所変数
  • 関数変数例
  • 関数再帰
  • 再帰例
  • 関数例
  • 関数の詳細


    プロシージャプログラミングでは、コードが再利用されます.プロセスプログラミングはまた、モジュール化プログラミングと構造化プログラミングに分けられる.コードを再利用したコードセグメントをネーミングし、繰り返し呼び出します.これが関数です.
    関数(function):独立した機能のコードを全体として、名前を付けて、名前のコードセグメントになります.これが関数です.
    関数を使用する場合は、次の点に注意してください.
  • 1、定義関数のコードセグメントは、定義時には実行されず、呼び出し時にのみ実行される.
  • 2、スクリプトで関数を呼び出す場合は、コードに関数名を指定すればよい.
  • 3、関数名が表示される任意の場所は、コード実行時に自動的に関数コードに置き換えられます.

  • 関数構文


    関数でよく使用される構文フォーマットは2つあります.
  • 構文フォーマット1
  • function  f_name  {
    	...   ...
    }
    
  • 構文フォーマット2
  • f_name()  {
    	...   ...
    }
    

    関数のライフサイクル


    関数のライフサイクルは、呼び出されたときに開始され、返されたときに終了します.
    そのステータスは、関数体が実行する最後のコマンドのステータス結果を返します.もちろん、ステータスをカスタマイズして結果を返すこともできます.
  • カスタム関数のステータス戻り値は、コマンド:returnを使用する必要があります.フォーマットは次のとおりです.# return [0-255] ; 0 ; 1~255 。
  • 関数の実行中、returnに遭遇すると、スクリプトのexitと同様に、関数に未実行のコマンドがある場合でも実行が終了します.

  • ステータス戻り結果とステータス戻り値を区別することに注意してください.
           :     ls        
            :    # echo $?     。0     ; 1~255     。
    

    関数の戻り値


    関数の戻り値は2つです.
  • 1、関数の実行結果の戻り値
  • a、   echo    printf       (printf     )
    b、              
    
  • 2、関数の脱退状態コード
  • a、                        
    b、   :return  
    

    関数パラメータ


    関数は関数を受け入れ、関数体では$1,$2,...を使用して関数に渡されるパラメータを参照できます.また、$*または$@を使用してすべてのパラメータを参照し、$#を使用して渡されたパラメータの個数を参照することもできます.関数を呼び出すときは、関数の後ろに所定のパラメータのリストを空白文字で区切ってください.例えば、testfunc arg 1 arg 2 arg 3...
    ただし、スクリプトパラメータと関数パラメータは別物であり、以下の例で理解できることに注意してください.
    1、10人のユーザーを追加し、ユーザーを追加する機能は関数で実現し、ユーザー名はパラメータとしてパラメータに渡される.
    [root@LeeMumu ~]# bash userAdd10.sh JC
    Add user JC1 finished.
    Add user JC2 finished.
    Add user JC3 finished.
    Add user JC4 finished.
    Add user JC5 finished.
    Add user JC6 finished.
    Add user JC7 finished.
    Add user JC8 finished.
    Add user JC9 finished.
    Add user JC10 finished.
    [root@LeeMumu ~]# cat userAdd10.sh 
    #!/bin/bash
    #
    # 5:user exists
    addusers() {
    if id $1 &> /dev/null; then
    	return 5
    else
    	useradd $1
    	retval=$?
    	return $retval
    fi
    }
    
    for i in {1..10}; do
    	addusers ${1}${i}                  # ${1}${i}         addusers          $1 
    	retval=$?
    	if [ $retval -eq 0 ]; then
    		echo "Add user ${1}${i} finished."
    	elif [ $retval -eq 5 ]; then
    		echo "user ${1}${i} exists."
    	else
    		echo "Unkown Error."
    	fi
    done
    

    2、1つのスクリプトを編纂して、192.168.1.1~192.168.1.254の間のどのアドレスがping通することができるかを確認します.
    [root@LeeMumu ~]# bash pING.SH 
    Ping 192.168.1.1 successfully!
    Ping 192.168.1.2 successfully!
    ... ...
    [root@LeeMumu ~]# cat pING.SH 
    #!/bin/bash
    #
    # 
    pingtest() {
    	if ping $1 -c 1 &> /dev/null ; then
    		echo "Ping $1 successfully!"
    	else
    		echo "Ping $1 unsuccessfully!"
    	fi
    }
    
    for i in {1..254}; do
    	pingtest 192.168.1.$i              # 192.168.1.$i         pingtest          $1 
    done
    

    3、NN乗算表を印刷する.
    [root@LeeMumu ~]# bash NN1.sh 2
    1X1=1	
    1X2=2	2X2=4	
    [root@LeeMumu ~]# bash NN1.sh 3
    1X1=1	
    1X2=2	2X2=4	
    1X3=3	2X3=6	3X3=9	
    [root@LeeMumu ~]# bash NN1.sh 5
    1X1=1	
    1X2=2	2X2=4	
    1X3=3	2X3=6	3X3=9	
    1X4=4	2X4=8	3X4=12	4X4=16	
    1X5=5	2X5=10	3X5=15	4X5=20	5X5=25	
    [root@LeeMumu ~]# cat NN1.sh 
    #!/bin/bash
    #
    #
    NN() {
    for ((i=1;i<=$1;i++));do
    	for ((j=1;j<=i;j++));do
    		echo -e -n "${j}X${i}=$[${i}*${j}]\t"
    	done
    	echo
    done
    }
    
    NN $1
    

    変数スコープ


    関数の全体的な理解を容易にするために,ここではローカル変数とローカル変数を説明する.

    1、ローカル変数


    ローカル変数の役割は、スクリプトを実行するshellプロセスのライフサイクルです.したがって、その役割範囲は現在のshellスクリプトファイルです.スクリプト実行時に実際のshellサブプロセスで実行され、スクリプト実行が終了すると変数が破棄されます.
        :name=value
        :${name}, $name
    	"":         ;
    	'':          ;
        :set
        :unset name
    	(  :       ;      $   ,          $   )
    

    2、局部変数


    ローカル変数の役割ドメインは、関数のライフサイクルであり、関数の終了時に自動的に破棄されます.
          :local VARIABLE=VALUE
    

    関数変数の注意事項:
  • 1、関数の終了はスクリプトの終了ではありません.
  • 2、関数にコマンド変数がある場合は、できるだけローカル変数として定義します.
  • 、関数の中でローカル変数を呼び出すことができて、またローカル変数の値に対して修正を行うことができて、自分のスクリプト変数に対して影響を生むことができて、だから関数とメインプログラムがインタラクティブでない情況の下で、関数の中でできるだけlocalを使ってローカル変数を定義します.
  •        ,           :
    	https://mp.csdn.net/mdeditor/95232625#bash_234
    

    関数変数の例


    以下の例では,関数変数の理解を強化することができる.1、関数はローカル変数を使用し、ローカル変数の値を変更します.
    [root@LeeMumu ~]# bash fUNCTION1.sh  #     ,                  
    Function: jerry
    Shell: jerry
    [root@LeeMumu ~]# cat fUNCTION1.sh 
    #!/bin/bash
    #
    name=tom                             #        name=tom
    
    setname() {
    	name=jerry                       #            
    	echo "Function: $name"           # echo     
    }
    
    	setname                          #     
    	echo "Shell: $name"              # echo         
    

    2、関数はローカル変数を使用し、ローカル変数の値は変更されません.
    [root@LeeMumu ~]# bash fUNCTION2.sh  # #     ,            
    Function: jerry
    Shell: tom
    [root@LeeMumu ~]# cat fUNCTION2.sh 
    #!/bin/bash
    #
    name=tom                         
    
    setname() {
     	local name=jerry                       
    	echo "Function: $name"           
    }
    
    	setname                          
    	echo "Shell: $name"              
    

    関数の再帰


    関数再帰とは、関数が直接または間接的に自身を呼び出すことを意味します.

    再帰例


    1、階乗関数
    [root@LeeMumu ~]# bash factTest.sh 1
    1
    [root@LeeMumu ~]# bash factTest.sh 2
    2
    [root@LeeMumu ~]# bash factTest.sh 3
    6
    [root@LeeMumu ~]# bash factTest.sh 11
    39916800
    [root@LeeMumu ~]# cat factTest.sh 
    #!/bin/bash
    #
    #
    fact() {
    	if [ $1 -eq 0 -o $1 -eq 1 ] ;then
    		echo 1
    	else
    		echo $[$1*$(fact $[$1-1])]    # ()         []     
    	fi
    }
    
    fact $1
    

    2、フィボナッチ数列フィボナッチ数列(Fibonacci sequence)は、黄金分割数列とも呼ばれ、数学者レオナルド・フィボナッチ(Leonardoda Fibonacci)がウサギの繁殖を例に導入したことから「ウサギ数列」とも呼ばれ、1、1、2、3、5、8、13、21、34、・・・・数学的には、フィボナッチ数列は、F(1)=1、F(2)=1、F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)は現代の物理,準結晶構造,化学などの分野でフィボナッチ数列に直接応用されているため,米国数学会は1963年から「フィボナッチ数列季刊」という名の数学雑誌を出版し,この方面の研究成果を専門に掲載している.
    [root@LeeMumu ~]# bash fUNCTION3.sh 9
    1 1 2 3 5 8 13 21 34 
    [root@LeeMumu ~]# cat fUNCTION3.sh 
    #!/bin/bash	
    #
    fab() {
    	if [ $1 -eq 1 ]; then
    		echo -n "1 "
    	elif [ $1 -eq 2 ]; then
    		echo -n "1 "
    	else
    		echo -n "$[$(fab $[$1-1])+$(fab $[$1-2])] "
    	fi
    }
    
    for i in $(seq 1 $1); do
    	fab $i
    done 
    echo
    

    関数の例


    1、ユーザー名を指定し、そのユーザーのid番号とデフォルトのshellを取得する.
    [root@LeeMumu ~]# bash idShell.sh user33 
    1006:/bin/bash
    [root@LeeMumu ~]# cat idShell.sh 
    #!/bin/bash
    #
    userinfo() {
    	if id "$username" &> /dev/null ; then
    		grep "^$username\>" /etc/passwd | cut -d: -f3,7 
    	else
    		echo "No  Such User."
    	fi
    }
    
    username=$1
    userinfo 
    

    2、サービスフレームワークスクリプトの作成
    #!/bin/bash
    #
    # chkconfig: - 50 50
    # description: test service script
    #
    prog=$(basename $0)
    lockfile=/var/lock/subsys/$prog
    
    start() {
    	if [ -f $lockfile ]; then
    		echo "$prog is running yet."
    	else
    		touch $lockfile
    		[ $? -eq 0 ] && echo "start $prog finshed."
    	fi
    }
    stop() {
    	if [ -f $lockfile ]; then
    		rm -f $lockfile
    		[ $? -eq 0 ] && echo "stop $prog finished."
    	else
    		echo "$prog is not running."
    	fi
    }
    status() {
    	if [ -f $lockfile ]; then
    		echo "$prog is running"
    	else
    		echo "$prog is stopped."
    	fi
    }
    usage() {
    	echo "Usage: $prog {start|stop|restart|status}"
    }
    
    case $1 in
    start)
    	start ;;
    stop)
    	stop ;;
    restart)
    	stop
    	start ;;
    status)
    	status ;;
    *)
    	usage
    	exit 1 ;;
    esac