linuxノートのbashプログラミング(三)


bashスクリプトプログラミングの関数
1、bashスクリプトプログラミング関数の役割?
答え:関数の主な機能はコードの再利用のためで、モジュール化のプログラミング、スクリプトのコードの構造がはっきりしています.
2、関数の定義形式はいくつかありますが、具体的にはどんな形式ですか.
答:関数の定義形式の1つ:
function関数名{
かんすうたい
}
関数の定義形式の1つ:
関数名(){
かんすうたい
}
例:172.16.0.0内のすべてのホストのステータスを検出
#!/bin/bash
#*****************************************************************************************
#                              Check user login System                                   *
#                              zouhg 2014-12-3                                           *
#*****************************************************************************************
#*****************************************************************************************
#                               function code                                            *
#*****************************************************************************************
function Ping {
    ip=$1
    if ping -t1 -w1 $ip &> /dev/null;then
        echo -e "\033[32m$ip is On-line\033[0m"
    else
        echo -e "\033[31m$ip not On-line\033[0m"
    fi
}
#*****************************************************************************************
#                               Mian function code                                       *
#*****************************************************************************************
main() {
for i in {0..255};do
    for j in {1..254};do
        Ping 172.16.$i.$j
    done
done
}
main

3、関数の基本的な使い方
関数の呼び出し:関数名を使用すると、関数名が表示される場所が自動的に関数コードに置き換えられます.
関数の戻り値:関数の実行結果の戻り値:(1)関数で印刷文を使用する:echo、printf
(2)関数体におけるシステムコマンド実行結果の出力
関数の終了ステータスコード:デフォルトは、関数体が実行する最後のコマンドの終了ステータスコードに依存します.
カスタム終了ステータスコード:return[0-255];注意:関数体が実行されると、return文に遭遇すると、関数が返されます.
関数許容パラメータ:パラメータを関数に渡す:関数を呼び出す場合、関数名の後にパラメータリストを与えるだけでよい.書式:関数名パラメータ1パラメータ2パラメータ3..
関数体で$1,$2......を使用できます.伝達された各パラメータを呼び出す.スクリプトのような特殊な変数:$*,$@:パラメータリスト、$#:パラメータの個数を一度に取得できます.
例:要件:1、現在のシステム上のすべてのディスクデバイスをリストします.
2、ユーザーに1つのディスクデバイスを選択させ、選択後に指定されたデバイス上のすべてのパーティション情報を表示させる.
3、ユーザーにこのディスク上のすべての既存のパーティションを消去するかどうかを尋ねた後、3つのパーティションを再追加します.
yまたはyes:続行
nまたはno:スクリプトの中止
他の文字は、ユーザーに正当な文字を再入力するように注意します.
4、ユーザーが「Yes」を選択した後、該当するパーティション操作を実行する
3つのパーティションの作成
プライマリパーティション1:512 M,ext 4
メインパーティション2:512 M,swap
プライマリパーティション3:2 G,ext 4
5、作成したパーティションを上記の説明に従って、それぞれ対応するファイルシステムにフォーマットする.
6、メインパーティション1を/mnt/bootディレクトリにマウントし、メインパーティション3を/mnt/sysrootディレクトリにマウントする.
#!/bin/bash
#**************************************************************************
#                          zouhg 2014-12-2                                *
#                          fdisk tool                                     *
#**************************************************************************
#**************************************************************************
#                      Function code section                              *
#**************************************************************************
function ListDsik {
	echo "The current system of disk:"
	fdisk -l |grep "Disk /dev/[sh]d" |cut -d: -f1|cut -d' ' -f2
}

function ListPart {
	if [ -b $1 ];then
		fdisk -l $1
		return 0
	else
		return 1
	fi
}

function CheckMount {
	if mount |grep "$1" &> /dev/null ;then
		for mountDisk in `mount |grep "$1" |cut -d' ' -f1`;do
			if ! umount $mountDisk &> /dev/null;then
				fuser -km $mountDisk &> /dev/null
				umount $mountDisk &> /dev/null
			fi
		done
	fi
}

function Partition {
	local dvice=$1
	dd if=/dev/zero of=$dvice bs=510 count=1 &> /dev/null
	echo -e "\033[32m$1 clean partitions successfully\033[0m"
	echo -e "n
p
1

+512M
n
p
2

+512M
n
p
3

+2G
t
2
b8
wq" |fdisk $dvice &> /dev/null partx -d $dvice  &> /dev/null partx -a $dvice  &> /dev/null echo  -e "\033[32mCreate partitions successfully \033[0m" } function Mkfs { local mk_type=$1 local dir_dvice=$2 if [ $mk_type == "swap" ];then mkswap $dir_dvice &> /dev/null else mkfs -t $mk_type $dir_dvice &>/dev/null fi echo -e "\033[32mmkfs $dir_dvice successfully\033[0m"  } function Mount { local dir_dvice=$1 local dir_point=$2 if [ -d  $2 ] ;then mount ${dir_dvice} $dir_point &> /dev/null else mkdir -p $dir_point &> /dev/null mount ${dir_dvice} $dir_point &> /dev/null fi echo -e "\033[32mmount $dir_dvice successfully\033[0m" } #************************************************************************** #                          The main function of part of the code          * #************************************************************************** main(){ while true ;do ListDsik read -p "Please enter an existing disk:" disk if ListPart $disk;then while true;do read -p "Delete the partition table,select the automatically partition(yes/no):" delete case $delete in yes) CheckMount $disk Partition $disk Mkfs "ext4" ${disk}1 Mkfs "swap" ${disk}2 Mkfs "ext4" ${disk}3 Mount ${disk}1 "/mnt/boot" Mount ${disk}3 "/mnt/sysroot" break;; no) break;; *) echo -e "\033[31mERR:Please input yes or no!!!\033[0m";; esac done break else echo -e "\033[31mERR:Disk equipment department \033[0m" fi done } main