linuxノートのbashプログラミング(三)
bashスクリプトプログラミングの関数
1、bashスクリプトプログラミング関数の役割?
答え:関数の主な機能はコードの再利用のためで、モジュール化のプログラミング、スクリプトのコードの構造がはっきりしています.
2、関数の定義形式はいくつかありますが、具体的にはどんな形式ですか.
答:関数の定義形式の1つ:
function関数名{
かんすうたい
}
関数の定義形式の1つ:
関数名(){
かんすうたい
}
例:172.16.0.0内のすべてのホストのステータスを検出
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ディレクトリにマウントする.
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