bash腳本編程
bash腳本編程之用戶交互:
腳本參數(shù)
用戶交互:通過(guò)鍵盤輸入數(shù)據(jù)
read [option]...[name]...
-p: "PROMPT"
-t: TIMEOUT
#!/bin/bash
#
read -p "Enter a username: " name
[ -z "$name‘] && password="password"
if id $name &> /dev/null; then
echo "$name exists."
else
useradd $name
echo "$password" | passwd --stdin $name &> /dev/null
echo "Add user $name finished."
fi
bash -n /path/to/fome_script
檢測(cè)腳本中的語(yǔ)法錯(cuò)誤
bash -x /path/to/some_script
調(diào)試執(zhí)行
示例:
#!/bin/bash
#Version:0.0.1
#Version:MageEdu
#Description: read testing
read -p "Enter a disk special file:"diskfile
[ -z "$diskfile" ] && echo "Fool" && exit 1
if fdisk -l | grep "^Disk $diskfile" &> /dev/null; the
fdisk -l &
else
echo "wrong disk special file."
exit2
fi
過(guò)程是編程語(yǔ)言的執(zhí)行流程:
順序執(zhí)行
選擇執(zhí)行
循環(huán)執(zhí)行
選擇執(zhí)行:
(1)&&,||
(2)if 語(yǔ)句
(3)case語(yǔ)句
if語(yǔ)句:三種格式
單分支的if語(yǔ)句
if CONDITION,then
if-true-分支;
fi
雙分支的if語(yǔ)句
fi CONDITION; then
if-true-分支
else
if-false-分支
fi
多分支的if語(yǔ)句
if CONDITION1; then
條件1為真分支;
elif CONDITION2;then
條件2為真分支
elif CONDITION3; then
條件3為真分支
.......
elif CONDITIONn; then
條件n為真分支
else
所有條件均不滿足是的分支
fi
注意:即便多個(gè)條件可能同時(shí)都能滿足,分支之后執(zhí)行其中一個(gè),首先測(cè)試為“真”;
示例:腳本參數(shù)傳遞路徑給腳本,判斷此文件的類型;
#!/bin/bash
#
if [ $# -lt 1 ]; then
echo "At least on path."
exit 1
fi
if ! [ -f $1 ]; then
echo "No such file."
exit 2
fi
if [ -f $1 ]; then
echo "Common file."
elif [ -d$1 ]; then
echo “Directory."
elif [ -L $1 ]; then
echo :Symbolic link."
elif [ -b $1 ]; then
echo "block special file."
elif [ -c $1 ]; then
echo "character special file."
elif [ -S $1 ]; then
echo "Socket file."
else
echo "Unkown."
fi
注意: if語(yǔ)句可嵌套;
練習(xí):寫一個(gè)腳本
(1)傳遞一個(gè)參數(shù)給腳本,此參數(shù)為用戶名;
(2)根據(jù)其ID號(hào)來(lái)判斷用戶類型;
0:管理員
1-999:系統(tǒng)用戶
1000+:登錄用戶
先vim usertype.sh
#!/bin/bash
#
[ $# -lt 1 ] && echo "At least on user name." && exit 1
! id $1 &>/dev/null && echo "No such user." && exit 2
user id=$(id -u $1 )
if [ $userid -eq 0 ]; then
echo "root"
elif [ $userid -ge 1000 ]; then
echo "login user."
else
echo "system user.”
fi
bash -n usertype.sh
bash -x usertype.sh abc
bash -x usertype.sh root
bash -x usertype.sh centos
bash -x usertype.sh daemon
cat usertype.sh
練習(xí):寫一個(gè)腳本
(1)列出如下菜單給用戶:
disk)show disks info,
mem)show memory info;
cpu)show cpu info;
*)quit;
vim sysinfo.sh
#!/bin/bash
#
cat << EOF
disk) show disks info
mem) show memory info
cpu show cpu info
*) QUIT
EOF
read -p "Your choice : " option
if [[ "$option" == "disk" ]]; then
fdisk -l /dev[sh]d[a-z]
elif [[ "$option" == "mem" ]]; then
free -m
elif [[ "$option" == "cpu" ]]; then
lscpu
else
echo "Unkown option."
exit 3
測(cè)試:bash -x sysinfo.sh
(2)顯示用戶給出自己的選擇,而后顯示對(duì)應(yīng)其選擇的相應(yīng)系統(tǒng)信息;
循環(huán)執(zhí)行:將一段代碼重復(fù)執(zhí)行0、1或多次;
進(jìn)入條件;條件滿足是才進(jìn)入循環(huán);
退出條件;每個(gè)循環(huán)都應(yīng)該有退出條件;以有機(jī)會(huì)退出循環(huán);
bash 腳本:
for 循環(huán)
while循環(huán)
unit循環(huán)
for循環(huán):
兩種格式:
(1)遍歷列表
(2)控制變量
遍歷列表:
for VARAIBLE in LIST; do
循環(huán)體
done
進(jìn)入條件:只要列表有元素,即可進(jìn)入循環(huán);
退出條件:列表中的元素遍歷完成;
LISTT的生成方式:
(1)直接給出;
(2)整數(shù)列表
(a)start..end}
(b)seq [start [incremtal]] last
(3)返回列表命令
(4)glob
(5) 變量引用
$ @, $*
#!/bin/bash
#
for username in user21 user22 user23; do
if id $username &> /dev/null; then
echo "$username exists."
else
useradd $username && echo "Add user $username finished."
fi
done
示例:求100以內(nèi)所有的正整數(shù)之和;
sum=0+1
sum=sum+2
sum=sum+3
sum=1+2+3+4...100
#!/bin/bash
#
declare -i sum=0
for i in {1..100 }; do
echo "\$sum is $sum, \$i is $i "
sum=$ [ $sum+$i ]
done
echo $sum
示例:判斷/var/log 目標(biāo)下是每一個(gè)文件的內(nèi)容類型
#!/bin/bash
#
for filename in /var/log/*;do
if [-f $filename ]; then
echo “Common file."
elif [ -d $filename ]: then
echo "Directory."
elif [ -L $filename ]; then
echo "Symbolic link."
elif [ -b $filename ]; then
echo "block special file."
elif [ -c$filename ]; then
echo "character special file."
elif [ -s $filename ]; then
echo "Socket file."
else
echo "Unkown."
done