Linux shellスクリプトの関数Functionの詳細
7738 ワード
Linux shellスクリプトの関数Function
関数の詳細
プロシージャプログラミングでは、コードが再利用されます.プロセスプログラミングはまた、モジュール化プログラミングと構造化プログラミングに分けられる.コードを再利用したコードセグメントをネーミングし、繰り返し呼び出します.これが関数です.
関数(function):独立した機能のコードを全体として、名前を付けて、名前のコードセグメントになります.これが関数です.
関数を使用する場合は、次の点に注意してください.
関数構文
関数でよく使用される構文フォーマットは2つあります.
function f_name {
... ...
}
f_name() {
... ...
}
関数のライフサイクル
関数のライフサイクルは、呼び出されたときに開始され、返されたときに終了します.
そのステータスは、関数体が実行する最後のコマンドのステータス結果を返します.もちろん、ステータスをカスタマイズして結果を返すこともできます.
# return [0-255] ; 0 ; 1~255 。
ステータス戻り結果とステータス戻り値を区別することに注意してください.
: ls
: # echo $? 。0 ; 1~255 。
関数の戻り値
関数の戻り値は2つです.
a、 echo printf (printf )
b、
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
関数変数の注意事項:
, :
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