シェルスクリプト戦略-関数アプリケーション(戻り値、パラメーターの受け渡し、変数スコープ、再帰、関数ライブラリ)


I.概要

  • 一部のコマンドシーケンスは繰り返し呼び出して実行する必要があるため、シェル関数もよく使用されます。同じコマンドを使用して毎回再度書き込むと、大量のコードと大量の行が発生します。
  • この問題を解決するために、コマンドシーケンスフォーマットでまとめて記述し、再利用できるようにすることができます。
  • つまり、シェル機能の本質は、再利用できるスクリプトコードであり、このコードは事前に記述され、指定された場所に配置されます。使用時に直接呼び出すことができます。

2.フォーマット定義

  • [関数]はオプションで、関数の機能を示します。これは省略できます
  • 関数名の後に()が続き、内部にコンテンツはありません
  • そして、実行するコマンドのシーケンスは{}に配置されます
  • たまにたくさんの関数を呼び出すと、一度にいくつか書くことができます
  • 形式は次のとおりです。
#格式一:

function 函数名 {
    
    
        命令序列
}


#格式二:

函数名() {
    
    
        命令序列
}


3、関数の戻り値

  • returnは、関数を終了して終了値を返すことを意味します。これは、スクリプトの$?変数で表示できます。
  • 使用原理:
    • $?変数は最後に実行されたコマンドの終了ステータスコードのみを返すため、戻り値は関数が終了するとすぐに取得されます。
    • 終了ステータスコードは0〜255である必要があります。値を超えると値は256で除算されます。
  • 例1:
[root@localhost sh]# vim xc1.sh

#!/bin/bash

function xcf {
    
    
        read -p "请输入:" a
        a=$[$a*2]
        return $a
}

xcf
echo $?

マーク

  • 例2:
[root@localhost sh]# vim xc2.sh

#!/bin/bash

xcf() {
    
    
read -p "请输入:" a
        a=$[$a*2]
        echo $a

}

result=`xcf`
echo $result        ##建议把值放入变量,方便以后调用

マーク

補足:

  • {}に続くのは「メインコマンド」で、最初に実行されるのはこれです
  • 関数名を呼び出した後、上記のコマンドシーケンスのコードが実行されます

4、関数パラメータの転送

  • 名前が示すように、パラメータを渡すことはパラメータを渡すこと意味します
  • 以前位置変数を学習したので、ここでは繰り返しません
  • 例は次のとおりです。
[root@localhost sh]# vim xc3.sh

#!/bin/bash

sum() {
    
    

xcf=$[$1 + $2]
echo $xcf

}

read -p "输入第一个参数:" first
read -p "输入第二个参数:" second

sum $first $second        ##调用函数,传第一个以及第二个输入的值,传参给$1以及$2

マーク

  • もう1つのより便利な方法
  • そして、私はこの方法が理解しやすいと思います
    マーク
    マーク
  • 前者の方法はより人道的ですが、私たちの専門家にとって、後者の方法はより迅速かつ効率的に使用されることがよくあります
  • よりハイエンドのアプリケーションシナリオは、多くの場合、それほど多くの「人間化」を必要とせず、すべて自動化されています

5、関数変数のスコープ

  • シェルスクリプトの関数は、現在のシェル環境でのみ有効です
  • シェルスクリプトの変数はデフォルトでグローバルです
  • ローカルコマンドを使用して、変数を関数に制限します
  • 例は次のとおりです。
[root@localhost opt]# vim xc1.sh

#!/bin/bash

zxc() {
    
    

a=5
b=6
echo "c等于$c"
}

a=8
c=9
zxc
echo "a等于$a"
echo "b等于$b"
  • ご覧のとおり、mainコマンドで定義されたcは関数でも有効です
  • なぜ最初にcを出力するのか、メインコマンドの順序に注意し、最初にaとcを定義し、次に関数zxcを定義し、関数zxcでaとbを再定義し、元の定義を上書きしてから、zxcの下に置きます。 aとbの出力なので、シーケンスは次のようになります。
[root@localhost opt]# ./xc1.sh 
c等于9
a等于5
b等于6
  • 関数によって定義された値を関数に限定したい場合は、ローカルを使用する必要があります
  • 関数のみ有効になる変数は、ローカル変数とも呼ばれます。次に例を示します
[root@localhost opt]# vim xc2.sh

#!/bin/bash

zxc() {
    
    
local i
i=8
echo "inside $i"

}

i=9
zxc
echo "outside $i"
  • 内側と外側は区別するために使用され、識別と理解が容易です
  • 最初にi = 9を定義し、次に関数zxcを出力し、関数でi = 8を定義し、8内で出力します。ここにローカルが追加されているため、関数で定義された8は関数内でのみ有効であり、関数外の$ iは引き続き有効です。 9最初に定義
[root@localhost opt]# chmod +x xc2.sh 
[root@localhost opt]# ./xc2.sh 
inside 8
outside 9
  • 印象をさらに深めましょう
    マーク
    マーク
  • ローカル変数とグローバル変数は2つの異なる変数であり、異なる値を割り当てることができ、同じ名前を付けることができます。以下の例を参照して説明してください
    マーク
    マーク

六、再帰

  • 関数は直接または間接的に独自の関数を呼び出します
  • 言うまでもありませんが、表示を開始します

1.ファクター

人気のある科学

  • Factorialは、1808年にKeston Kamanによって発明された算術記号であり、数学用語です。
  • 正の整数の因数分解は、数値以下のすべての正の整数の積であり、0の因数分解は1です。
自然数n的阶乘写作n!  
n!=1×2×3×…×n

阶乘亦可以递归方式定义:  
0!=1,n!=(n-1)!×n  
n!=n(n-1)(n-2)…1

デモ

マーク
マーク

2.再帰ディレクトリ

  • 再帰の本質:
    • いつから
    • いつ終わるの
    • 各再帰は何をする必要がありますか
  • 例は次のとおりです。
  • / var / logの下にあるすべてのファイルをトラバースします
[root@localhost opt]# vim xc4.sh

#!/bin/bash

function list_files {
    
    
##定义递归遍历目录的函数
for f in `ls $1`
##循环遍历目录
do
        if [ -d "$1/$f" ]
        then
        ##判断若为目录则按格式输出目录名称并继续调用函数遍历这个目录
                echo "$2$f"
                list_files "$1/$f" "$2"
        else
        ##判断若为文件则直接按照格式输出文件名称
                echo "$2$f"
        fi
done
}

list_files "/var/log" ""
##调用函数,第一个参数为要进行遍历的目录,第二个参数为格式设定,区分目录层级
  • 1つテストする
[root@localhost opt]# ./xc4.sh 
anaconda
anaconda.log
ifcfg.log
journal.log
ks-script-1_XapN.log
ks-script-b5hX60.log
packaging.log
program.log
storage.log
syslog
X.log
audit
audit.log
boot.log
boot.log-20201222
.
..
...
....
.....略

7、関数ライブラリを作成します

関数ライブラリには関数の定義のみが含まれ、スクリプトには関数の定義と実行可能コードの両方が含まれています

  • 次の関数を実装する関数ライブラリを定義します
    • 追加機能
    • 減算機能
    • 乗算関数
    • 分割機能
  • まず、基本的な関数ライブラリファイルを定義します
[root@localhost opt]# vim xc5.sh

#!/bin/bash

jiafa () {
    
    
        result=$[$1 + $2]
        echo $result
}

jianfa () {
    
    
        result=$[$1 - $2]
        echo $result
}

chengfa () {
    
    
        result=$[$1 * $2]
        echo $result
}

chufa () {
    
    
if [ $2 -ne 0 ]
        then
                result=$[$1 / $2]
                echo $result
        else
                echo "$2不能等于0!"
fi
}

  • スクリプトを定義する
[root@localhost opt]# vim xc6.sh

#!/bin/bash

. /opt/xc5.sh        ##引入函数库文件

read -p "输入第一个参数值:" first
read -p "输入第二个参数值:" second

result1=`jiafa $first $second`
result2=`jianfa $first $second`
result3=$(chengfa $first $second)
result4=$(chufa $first $second)

echo $result1
echo $result2
echo $result3
echo $result4
  • 1つテストする
    マーク

おすすめ

転載: blog.csdn.net/weixin_51486343/article/details/111568761