bash脚本编程
bash脚本编程之用户交互:
脚本参数
用户交互:通过键盘输入数据
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
检测脚本中的语法错误
bash -x /path/to/some_script
调试执行
示例:
#!/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
过程是编程语言的执行流程:
顺序执行
选择执行
循环执行
选择执行:
(1)&&,||
(2)if 语句
(3)case语句
if语句:三种格式
单分支的if语句
if CONDITION,then
if-true-分支;
fi
双分支的if语句
fi CONDITION; then
if-true-分支
else
if-false-分支
fi
多分支的if语句
if CONDITION1; then
条件1为真分支;
elif CONDITION2;then
条件2为真分支
elif CONDITION3; then
条件3为真分支
.......
elif CONDITIONn; then
条件n为真分支
else
所有条件均不满足是的分支
fi
注意:即便多个条件可能同时都能满足,分支之后执行其中一个,首先测试为“真”;
示例:脚本参数传递路径给脚本,判断此文件的类型;
#!/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语句可嵌套;
练习:写一个脚本
(1)传递一个参数给脚本,此参数为用户名;
(2)根据其ID号来判断用户类型;
0:管理员
1-999:系统用户
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
练习:写一个脚本
(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
测试:bash -x sysinfo.sh
(2)显示用户给出自己的选择,而后显示对应其选择的相应系统信息;
循环执行:将一段代码重复执行0、1或多次;
进入条件;条件满足是才进入循环;
退出条件;每个循环都应该有退出条件;以有机会退出循环;
bash 脚本:
for 循环
while循环
unit循环
for循环:
两种格式:
(1)遍历列表
(2)控制变量
遍历列表:
for VARAIBLE in LIST; do
循环体
done
进入条件:只要列表有元素,即可进入循环;
退出条件:列表中的元素遍历完成;
LISTT的生成方式:
(1)直接给出;
(2)整数列表
(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以内所有的正整数之和;
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 目标下是每一个文件的内容类型
#!/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