Linux shellスクリプトプログラミングの関数


機能が複雑なshellスクリプトを作成する場合、特定のタスクを完了するコードが重複して使用される場合があります.bash shellスクリプトは、名前が付けられたスクリプトコードブロックである関数特性を提供してコード多重化を実現します.
一、作成関数bash shellスクリプトで作成する関数のフォーマットは以下の通りです.
function name()
{
    commands
}	
の簡単な例は次のとおりです.
$ cat test.sh
#!/bin/bash
function func_test(){
    echo "hello world"
}
func_test;
$ ./test.sh
hello world
注意:関数は使用前に定義され、定義されていない関数を使用するとエラーが表示されます.
二、関数の戻り値
bash shellは関数を小型のスクリプトと見なし、関数の終了コード(すなわち戻り値)には3つの形式があります.
(1)デフォルト終了状態
一般的なスクリプトと同様に、関数の実行が完了すると、関数の終了コードは変数$?に表示されます.
$ cat test.sh
#!/bin/bash
function func_test(){
    echo "hello world"
}
func_test;
echo "func_test :$?"
$ ./test.sh
hello world
func_test :0
では、関数のデフォルト戻り値が0であることがわかりますが、関数のデフォルト戻り値は使用しないほうがいいです.次の例を見てください.
$ cat test.sh
#!/bin/bash
function func_test(){
    ls -l /xxx/xxxx  #/xxx/xxxx 
    echo "program end"
}
func_test;
echo "func_test :$?"
$ ./test.sh
ls:  '/xxx/xxxx':  
program end
func_test :0
はls-lコマンドの実行に失敗したことを示すが、最後のコマンドechoが正しく実行できるため、関数の戻り値は0である.関数の戻り値は、最後のコマンドの戻り値です.func_を実行しますtest後、リターンコードに基づいてls-lコマンドが成功したかどうかを判断することはできません.これは明らかに良い方法ではありません.
(2)関数でreturnコマンドを使用して指定した状態コードを返す
$ cat test.sh
#!/bin/bash
function func_test(){
    if ! ls -l /xxx/xxxx  #/xxx/xxxx 
    then 
         return 1
    fi
    echo "program end"
}
func_test;
echo "func_test :$?"
$ ./test.sh
ls:  '/xxx/xxxx':  
func_test :1
ls-lコマンドの実行に失敗し、関数は終了し、戻りコードは1です.2つの点に注意してください.
1、関数の戻りコードはスクリプトの戻りコードと同じで、値範囲は0~255 2で、関数の戻り値は関数の実行が終わったらすぐに取り出したほうがいい.(関数の後に他のコマンドが実行された場合、関数の戻りコードはコマンドの戻りコードで上書きされます)
(3)関数出力
関数出力を使用してshell変数に関数出力を格納すると、関数から任意のタイプの出力を取得できます.
$ cat test.sh
#!/bin/bash
function func_add(){
    read -p " :" a b 
    echo $[ $a+$b ]
}
result=`func_add`;
echo " :$result"
$ ./test.sh
 :100 300
 :400
三、関数にパラメータを渡す
スクリプトにパラメータを渡すのと同様に、Linux shelプログラミングのコマンドラインパラメータ処理を参照してください.
ここでは簡単な例を示します.
$ cat test.sh
#!/bin/bash
function func_add(){
    echo $[ $1+$2 ]
}
read -p " :"  a b
result=`func_add $a $b`;
echo " :$result"
$ ./test.sh
 :100 200
 :300

四、関数に変数を使う
変数役割ドメインはshellスクリプトプログラマが直面する一般的な問題であり、ドメインを使用すると変数の可視領域になります.関数内で定義される変数は、通常の変数とは異なる役割ドメインを有します.関数には、グローバル変数とローカル変数の2種類の変数が使用できます.グローバル変数グローバル変数はshellスクリプト内の随所で使用できる変数であり、スクリプトのメインコードがグローバル変数を定義している場合は、関数内部でこの変数の値を使用することができ、同様に、関数内部でグローバル変数を定義している場合は、スクリプトのメインコードでもこの変数の値を使用することができます.デフォルトでは、スクリプトで定義されている変数はすべてグローバル変数です.グローバル変数を使用する場合は、次の点に注意してください.
$ cat test.sh
#!/bin/bash
function test_global
{
 value=$[$value*2]
 temp=$value
}

value=12
test_global
echo "value=${value}"
echo "temp=${temp}"
$ ./test.sh
value=24
temp=24
2.ローカル変数
関数内でのみ使用できる変数をローカル変数と呼び、ローカル変数を宣言するときに変数名に「local」キーを付ける
$ cat test.sh
#!/bin/bash
function test_global
{
  local value=24
  echo "local value=${value}"
}

value=12
test_global
echo "global value=${value}"
$ ./test.sh
local value=24
global value=12
五、配列変数と関数
1.配列変数配列は複数の値を保存できる変数であり、配列内の値は単一の参照でもよいし、全体の参照でもよい.
$ cat test.sh
#!/bin/bash
array=(1 2 3 4 5)
echo ${array}
echo ${array[2]}
echo ${array[*]}
array[2]=333
echo ${array[*]}
$ ./test.sh 
1
3
1 2 3 4 5
1 2 333 4 5
上の例から、${array}を直接使用すると、最初の要素しか得られないことがわかります.${array[n]}を使用して、配列内の要素をインデックスから取得します.配列全体の値を得るにはecho${array[*]}を使用し、配列要素の値を直接変更することもできます.
2.関数に配列を渡す
配列変数を関数に渡すには,配列変数を単一のパラメータとして渡すと予想外の結果が得られる.
$ cat test.sh
#!/bin/bash
function test_array
{
   echo "The parameters are:$@"
}

array=(1 2 3 4 5)
test_array ${array}
$ ./test.sh
The parameters are:1
は、配列変数を関数パラメータとして直接使用することは明らかであり、配列変数の最初の要素しか得られない.配列変数を単一の要素に分割すると、この問題を解決できます.
$ cat test.sh
#!/bin/bash
function test_array
{
   echo "The parameters are:$@"
   new_array=(echo "$@")
   echo "new_array: ${new_array[*]}"
   sum=0
   for val in ${new_array[*]}
   do
       sum=$[${sum}+${val}]
   done
   echo "the total of array is :${sum}"
}

array=(1 2 3 4 5)
test_array ${array[*]}
$ ./test.sh
The parameters are:1 2 3 4 5
new_array: echo 1 2 3 4 5
the total of array is :15
3.関数から配列を返す
また、関数からshellスクリプトに配列変数を返信し、関数出力を使用して各配列の値を適切な順序で出力し、スクリプトはこれらのデータを新しい配列変数に再編成する必要があります.
$ cat test.sh
#!/bin/bash
function test_array
{
  ret_array=(1 2 3 4 5)
  echo "${ret_array[*]}"
}

array="(`test_array`)"
echo "the functon return:${array[*]}"
$ ./test.sh
the functon return:(1 2 3 4 5)
六、関数ライブラリ1つのスクリプトaで別のスクリプトb定義の関数を呼び出し、スクリプトファイルbを関数ライブラリとして使用したい場合は、sourceコマンドを使用してスクリプトa内部でスクリプトbを実行し(新しいshell実行スクリプトbを作成しない)、スクリプトaでスクリプトb定義の関数を使用することができます.スクリプトaに追加するだけです
source  /..../b.shまたは. /...../b.shでいい、/....../b.shはスクリプトbのパスを表す
.sourceがここで意味するのと同じです.
$ cat add.sh
#!/bin/bash
function add()
{
  echo $[$1+$2]
}
$ cat test.sh
#!/bin/bash
. ./add.sh
result=`add 1 2`
echo "1,2 :$result"
$ ./test.sh
1,2 :3