bash脚本编程:
面向过程:
顺序执行
选择执行: if, case
循环执行: for, while, until
For循环
for 变量 in 列表; do
语句1;
语句2;
...
done
循环必须有退出条件;
单分支if语句:
if 条件; then
语句1
语句2
...
fi
单分支if语句例子
1:写一个脚本,实现如下功能:如果用户存在,就说明其存在;
#!/bin/bash
#
UserName=user1
if grep "^$UserName\>" /etc/passwd &> /dev/null; then
echo "$UserName exists."
fi
-------------------------------------------------------------
-------------------------------------------------------------
#!/bin/bash
UserName=user1
if id $UserName &> /dev/null; then
echo "$UserName exists."
fi
2:写一个脚本,实现如下功能:如果用存在,就显示其UID和SHELL;
#!/bin/bash
#
UserName=user1
if id $UserName &> /dev/null; then
grep "^$UserName\>" /etc/passwd | cut -d: -f3,7
fi
3:写一个脚本,实现如下功能:如果设备/dev/sda3已经挂载,就显示其挂载点;
#!/bin/bash
#
Device='/dev/sda3'
if mount | grep "^$Device" &> /dev/null; then
mount | grep "/dev/sda3" | cut -d' ' -f3
fi
4:写一个脚本,实现如下功能:如果/etc/rc.d/rc.sysinit中有空白行,就显示其空白行数;
#!/bin/bash
#
File='/etc/rc.d/rc.sysinit'
if grep "^$" $File &> /dev/null; then
grep "^$" $File | wc -l
fi
双分支if语句:
if 条件; then
语句1
语句2
...
else
语句1
语句2
...
fi
练习:写一个脚本,实现如下功能:如果设备/dev/sda3已经挂载,就显示其挂载点;否则,就说明其未挂载或设备不存在;
#!/bin/bash
#
Device='/dev/sda3'
if mount | grep "^$Device" &> /dev/null; then
mount | grep "/dev/sda3" | cut -d' ' -f3
else
echo "$Device not mounted or not exist."
fi
多分支if语句:
语法格式:
if 条件1; then
语句1
语句2
...
elif 条件2; then
语句1
语句2
...
elif 条件3; then
语句1
语句2
...
else
语句1
语句2
...
fi
写一个脚本:
判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。
如果其生产商为GenuineIntel,就显示其为Intel公司;
如果其生产商为AuthenticAMD,就显示其为AMD公司;
否则,就显示无法识别;
#!/bin/bash
#
Vendor=`grep "vendor_id" /proc/cpuinfo | uniq | cut -d: -f2`
if [[ $Vendor =~ [[:space:]]*GenuineIntel$ ]]; then
echo "intel"
elif [[ $Vendor =~ [[:space:]]*AuthenticAMD$ ]]; then
echo "AMD"
else
echo "Unknown"
fi
bash条件测试:
可独立执行的命令不需使用如下测试的方式;
[ expression ] 括号内一般是需要测试的表达式 如:"$a" == "$b"
[[ expression ]]
test expression
bash命令有执行状态返回值;
bash的变量类型:
本地变量
局部变量
环境变量
位置变量
特殊变量:
$?: 用于保存刚刚执行的命令的状态返回值;
0:成功执行;
1-255:失败,1,2,127
可以使用exit命令在脚本中自定义脚本执行状态返回值;如果不定义,脚本执行状态返回值取决于脚本执行结束前最后执行的那个语句的状态;
$@, $*: 所有位置参数;
$#: 位置参数的个数;
bash整数测试:
expression: 数值1 比较符号 数值2
$A 比较符号 $B
大于:-gt
小于:-lt
等于:-eq
大等:-ge
小等:-le
不等:-ne
命令执行状态返回值: 0-255
0: 正确执行
1-255: 错误执行
exit [n] 脚本执行的最后一条件命令的状态返回值;
1:写一个脚本,生成两个随机数,比较其大小;显示大数;
bash有个内置变量:$RANDOM
$RANDOM 显示随机数
#!/bin/bash
#
A=$RANDOM
B=$RANDOM
if [ $A -ge $B ]; then
echo "Max number is $A."
else
echo "Max number is $B."
fi
2:写一脚本,随机生成一个整数,判定,显示其奇偶性;
#!/bin/bash
#
A=$RANDOM
if [ $[$A%2] -eq 0 ]; then
echo "$A: Even"
else
echo "$A: Odd"
fi
3:给定一个用户,如果其ID号大于499,就说明其是普通用户,否则,就说明其是管理员或系统用户;
#!/bin/bash
#
UserName=daemon
Uid=`id -u $UserName`
if [ $Uid -gt 499 ]; then
echo "A common user: $UserName."
else
echo "admin user or system user: $UserName."
fi
4:求200以内所有为3的整数倍的整数之和;
#!/bin/bash
#
Sum=0
for I in {1..200}; do
if [ $[$I%3] -eq 0 ]; then
Sum=$[$Sum+$I]
fi
done
echo "Sum: $Sum."
5:给定一个用户,如果其UID等于GID,就说明这是个“good guy”,否则,“Bad guy.”
#!/bin/bash
#
UserName=user1
if [ `id -u $UserName` -eq `id -g $UserName` ]; then
echo "Good Guy."
else
echo "Bad Guy."
fi
6:写一个脚本:计算100以内所有奇数的和以及所有偶数的和;分别显示之;
#!/bin/bash
#
EvenSum=0
OddSum=0
for I in {1..100}; do
if [ $[$I%2] -eq 0 ]; then
EvenSum=$[$EvenSum+$I]
else
OddSum=$[$OddSum+$I]
fi
done
echo "EvenSum is: $EvenSum. OddSum is: $OddSum."