1.Bash脚本条件判断和控制流结构
(1)Bash位置参数和退出状态 条件判断和控制流结构
(2)Bash位置参数
有两种简单的方法可以将用户输入读入bash中的变量。第一个方法是使用read提示用户输入(使用-p选项)并将其直接存储到一个或多个变量:
交互式输入
# read -p 'Enter your first and last name: ' FIRST LAST
另一个方法是使用位置参数来读取传递给脚本的命令行参数或选项输入。各种特殊变量存储传递的选项编号
Bash解析的个别参数或整个原始命令行。
指定的位置参数总数:$#
位置参数自身:$0、$1、$2、$3....
所有位置参数: $@、$*
[root@localhost mnt]# vim test.sh
#!/bin/bash
read -p "please give me a address: " a ##a在这里是一个变量,指定执行脚本时输入的ip
ping -c1 -w1 $a &> /dev/null && echo $a is up || echo $a is down ##ping命令判断该ip主机网络是否通着
[root@localhost mnt]# sh test.sh
please give me a address: 172.25.254.6
172.25.254.6 is up
(3)退出状态:
linux命令完成时,将返回退出状态。成功完成程序时,将返回0的推出状态。这被bash当作逻辑True值。非零退出状态通常表示发生了错误,并且被bash当作逻辑False值。
例如:grep的退出状态的含义:
0 – 在指定的文件中找到了模式
1 – 在指定的文件中未找到模式
>1 – 一些其他错误(无法打开文件、错误的搜索表达式等)
推出状态的值被存储在”?”中,可以使用以下命令查看:
echo $?
(4)字符串比较运算符:=、!=
[root@localhost mnt]# [ westos = westos ]; echo $? ##"="表示等于,"!="表示不相等
0
[root@localhost mnt]# [ westos = Westos ]; echo $?
1
[root@localhost mnt]# [ westos != Westos ]; echo $?
0
[root@localhost mnt]# a=1 ##给a赋值1
[root@localhost mnt]# b=1 ##给b赋值1
[root@localhost mnt]# [ "$a" = "$b" ] && echo yes || echo no ##当a等于b时,输出yes,否则输出no
yes
[root@localhost mnt]# [ "$a" != "$b" ] && echo yes || echo no ##当a不等于b时,输出yes,否则输出no
no
[root@localhost mnt]# b=2
[root@localhost mnt]# [ "$a" = "$b" ] && echo yes || echo no
no
[root@localhost mnt]# [ "$a" != "$b" ] && echo yes || echo no
yes
[root@localhost mnt]# [ ! "$a" = "$b" ] && echo yes || echo no ##当a不等于b时,输出yes,否则输出no
yes
(5)test具有替代语法,使用方括号"[]"将表达式括起来,这样更易于阅读。
[root@localhost mnt]# [ -n a ]; echo $? ##该命令效果与test -n "$a" ;echo $?相同,"[]"将表达式括起来
0
[root@localhost mnt]# [ -z a ]; echo $? ##该命令效果与test -z "$a" ;echo $?相同,"[]"将表达式括起来
1
[root@localhost mnt]# [ -n b ]; echo $?
0
[root@localhost mnt]# [ -z b ]; echo $?
1
(6)数字比较运算符:-eq、-ne、-lt、-le、-gt、-ge
-le 小于等于
-lt 小于
-gt 大于
-ge 大于等于
-ne 不等于
(7)文件状态运算符:test -{b|c|e|f|d|r|w|x|s|L} FILE/DIRECTORY
-b 块型
-c 字符型
-e 判断文件是否存在
-f 文件型
-d 目录
-x 可执行
-s 是否为空
-L/-h 软链接
-S 嵌套文件
[root@localhost mnt]# [ -b "/dev/vdb" ] && echo yes || echo no ##-b 判断是否是块,是输出yes
yes
[root@localhost mnt]# [ -c "/dev/pts/0" ]&& echo yes || echo no ##-c 判断是否为字符型
yes
[root@localhost mnt]# [ -e "/mnt" ]&& echo yes || echo no ##-e 判断是否存在
yes
[root@localhost mnt]# [ -f "/mnt/test.sh" ]&& echo yes || echo no##-f 判断是否是文件型
yes
[root@localhost mnt]# [ -d "/etc" ]&& echo yes || echo no ##-d 判断是否为目录
yes
[root@localhost mnt]# [ -x "/mnt/test.sh" ]&& echo yes || echo no##-x 判断是否可执行
yes
[root@localhost mnt]# touch file
[root@localhost mnt]# [ -s "/mnt/file" ]&& echo yes || echo no ##-s 判断是否不为空
no
[root@localhost mnt]# [ -S "/var/lib/MySQL/mysql.sock" ] && echo yes || echo no ##-S 判断是否为嵌套文件
yes
(8)二进制文件运算符:-ef、-nt、-ot
[ 1 -ef 2 ] 1和2互为硬链接
[ 1 -nt 2 ] 1比2新
[ 1 -ot 2 ] 1比2旧
[root@localhost mnt]# [ /bin/mount -ef /usr/bin/mount ] && echo yes || echo no
yes ##/bin/mount 和/usr/bin/mount互为硬链接
[root@localhost mnt]# touch test
[root@localhost mnt]# [ /mnt/file -nt /mnt/test ] && echo yes ||echo no
no ##/mnt/file 比 /mnt/test 旧
[root@localhost mnt]# [ /mnt/file -ot /mnt/test ] && echo yes ||echo no
yes ##/mnt/file 比 /mnt/test 旧
逻辑运算符:-o、-a、!、&&、||
[ a -o b ] ##条件a或者条件b成立
[ a -a b ] ##条件a和条件b都成立
[ ! a ] ##条件a不成立
[ a ] && 1 || 2 ##当条件a成立时,执行1,否则执行2
[root@localhost mnt]# [ 2 -gt 1 -o 2 -lt 1 ] && echo yes || echo no ##当2大于1成立或者2小于1成立时,输出yes
yes
[root@localhost mnt]# [ 2 -gt 1 -a 2 -lt 1 ] && echo yes || echo no ##当2大于1成立并且2小于1成立时,输出yes
no
2.if语句
if命令检查if后面的命令或列表的退出值。如果第一个命令评估为true/零,则运行then之后的命令列表,直至任一else。如果第一个命令评估为false/非零,则运行else与fi之间的命令列表(反向平写if,标记if块的结束)。
语法:if command; then command; command2; else command3; fi
脚本示例
eg1 实现自动建立文件写入的用户密码设置为westos,如果用户存在则不做任何操作
[root@localhost mnt]# vim create_user.sh
#!/bin/bash ##如果if后面的条件成立,则执行then后面的命令,否则直接进入else
if
[ -z "$*" ] ##判断脚本后面的字符是否不存在
then ##如不存在则执行then后面的命令
echo "USE: /mnt/create_user /mnt/userfile"
else ##否则执行else后面的命令
for NUM in $(seq 1 `wc -l $* | cut -d " " -f 1`) ##将$1中的行数赋值给NUM
do NAME=`sed -n ${NUM}p $*` ##将$1中的内容一行一行赋给变量NAME
id $NAME &>/dev/null ##用id命令判断用户是否存在
if [ "$?" = "0" ] ##如果$?=0成立即用户存在则输出$NAME is exist
then echo $NAME is exist
else `useradd $NAME` ##否则执行建立用户
`echo westos | passwd --stdin $NAME` &>/dev/null ##设定密码为westos
fi
done
fi