Shell编程及自动化运维实现-判断

一.shell条件测试

1.1格式

格式1:test 条件表达式
格式2:[ 条件表达式 ]
格式3:[[ 条件表达式 ]]

1.2文件测试[ 操作符 文件或目录 ]

示例
-d : 这是一个目录

[root@localhost ~]# test -d /home
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -d /home11111
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -d /home ]

注意中括号里的两个空格

操作符种类

-f filename : 当filename 存在时返回真
-b filename : 当filename 存在并且是块文件时返回真(返回0)
-d pathname : 当pathname 存在并且是一个目录时返回真
-h filename : 当filename 存在并且是符号链接文件时返回真 (-L filename)
-u pathname : 当由pathname 指定的文件或目录存在并且设置了SUID 位时返回真
-c filename : 当filename 存在并且是字符文件时返回真
-e pathname : 当由pathname 指定的文件或目录存在时返回真
-g pathname : 当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真
-k pathname : 当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真
-p filename : 当filename 存在并且是命名管道时返回真
-r pathname : 当由pathname 指定的文件或目录存在并且可读时返回真
-s filename : 当filename 存在并且文件大小大于0 时返回真
-S filename : 当filename 存在并且是socket 时返回真
-t fd       : 当fd 是与终端设备相关联的文件描述符时返回真
-w pathname : 当由pathname 指定的文件或目录存在并且可写时返回真
-x pathname : 当由pathname 指定的文件或目录存在并且可执行时返回真
-O pathname : 当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写)
-G pathname : 当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真
file1 -nt file2 : file1 比file2 新时返回真
file1 -ot file2 : file1 比file2 旧时返回真

1.3数值比较[ 整数1 操作符 整数2 ]

操作符

[ 1 -gt 2 ] 大于
[ 1 -lt 2 ] 小于
[ 1 -eq 2 ] 等于
[ 1 -ne 2 ] 不等于
[ 1 -ge 2 ] 大于等于
[ 1 -le 2 ] 小于等于

示例

[root@localhost ~]# vim user.sh
num=$(id -u)
if [   $num  -eq  0   ]
then
echo "administrator"
else
echo "user"
fi
[root@localhost ~]# bash user.sh
[root@localhost ~]# bash 1.sh
administrator
[js@localhost ~]# bash 1.sh
user

C语言风格

[root@localhost ~]# ((1<2));echo $?
0
[root@localhost ~]# ((1==2));echo $?
1
[root@localhost ~]# ((1>2));echo $?
1
[root@localhost ~]# ((1>=2));echo $?
1
[root@localhost ~]# ((1<=2));echo $?
0
[root@localhost ~]# ((1!=2));echo $?
0
[root@localhost ~]# ((`id -u`>0));echo $?
1
[root@localhost ~]# (($UID==0));echo $?
0

1.4字符串比较[ “字符串” = “字符串” ]

=,==,等于

猜测你的用户名是root

[root@localhost ~]# [ "$USER" = "root" ];echo $?
0
[root@localhost ~]# [ "$USER" == "root" ];echo $?
0

!=,不等于

[root@localhost ~]# [ "$USER" = "root" ];echo $?
0
[root@localhost ~]# [ "$USER" = "js" ];echo $?
1
[root@localhost ~]# [ "$USER" != "js" ];echo $?
0

-z:判断字符长度是为0,-n:判断字符长度不是0

双引号的重要性
定义三个变量,一个有值,一个妹纸,一个没有定义。

[root@localhost ~]# var1=111
[root@localhost ~]# var2=
//var3变量没有定义

-z:判断长度是0

[root@localhost ~]# [ -z "$var1" ];echo $?
1
[root@localhost ~]# [ -z "$var2" ];echo $?
0
[root@localhost ~]# [ -z "$var3" ];echo $?
0

-n:判断长度不是0

[root@localhost ~]# [ -n "$var1" ];echo $?
0
[root@localhost ~]# [ -n "$var2" ];echo $?
1
[root@localhost ~]# [ -n "$var3" ];echo $?
1
或者
[root@localhost ~]# echo ${#var1}
3
[root@localhost ~]# echo ${#var2}
0
[root@localhost ~]# echo ${#var3}
0

小结:变量为空 或 未定义: 长度都为0

1.5and和or

逻辑的(and)与(or)
&& 逻辑的 AND 的意思, -a 也是这个意思,两个条件同时成立,为真。

|| 逻辑的 OR 的意思, -o 也是这个意思,两个条件一个成立,为真。

示例
猜测用户输入的成绩是否良好(59~79)之间

[root@localhost ~]# num=59;[ $num -gt 60 -a $num -lt 80  ];echo $?
1
[root@localhost ~]# num=81;[ $num -gt 60 -a $num -lt 80  ];echo $?
1
[root@localhost ~]# num=60;[ $num -gt 60 -a $num -lt 80  ];echo $?
1
[root@localhost ~]# num=61;[ $num -gt 60 -a $num -lt 80  ];echo $?
0

多种表达方法

[root@localhost ~]# [ 1 -lt 2 -a 5 -gt 10 ];echo $?
1
[root@localhost ~]# [ 1 -lt 2 -o 5 -gt 10 ];echo $?
0

注意:&&调用正则时,请使用双中括号。

[root@localhost ~]# [[ 1 -lt 2 && 5 -gt 10 ]];echo $? 
1
[root@localhost ~]# [[ 1 -lt 2 || 5 -gt 10 ]];echo $? 
0
或者
[root@localhost ~]# [ 1 -lt 2 ] && [ 11 -gt 10 ];echo $? 
0

二.流程控制:if

1.单分支结构

语法

if  条件测试 
	then 命令序列 
fi

示例
编写脚本,由用户输入用户名,如果用户不存在,则创建该用户,并设置密码为123456

[root@localhost ~]# vim 1.sh
#!/bin/bash
read -p "Input username: " name
id $name &> /dev/null
if [ $? -ne 0 ]; then
	useradd $name
	echo "123456" | passwd --stdin $name &> /dev/null
	echo "$name create finished,the password is 123456"
fi

或者运用取反的方法

[root@localhost ~]# vim 1.sh
#!/bin/bash
read -p "Input username: " name
if ! id $name &> /dev/null; then
	useradd $name
	echo "123456" | passwd --stdin $name &> /dev/null
	echo "$name create finished,the password is 123456"
fi

2.双分支结构

语法

if 条件测试 
	then 命令序列 
	else 命令序列 
fi

示例1
编写脚本,由用户输入用户名,如果用户不存在,则创建该用户,并设置密码为123456;否则,提示用户已经存在

[root@localhost ~]# vim 1.sh
#!/bin/bash
read -p "Input username: " name
#id $name  &> /dev/null
#if  [  $?  -ne  0  ]     ;then
if ! id $name &> /dev/null; then
	useradd $name
	echo "123456" | passwd --stdin $name &> /dev/null
	echo "$name create finished,the password is 123456"
else
	echo "$name already exist"
fi

示例2
编写脚本,由用户输入用户名,判断该用户的uid及gid,如果相同,则显示Good user;
否则显示Bad user.

[root@localhost ~]# vim 1.sh
#!/bin/bash
read -p "Input username: " name
user_id=`id -u $name`
group_id=`id -g $name`
if [ $user_id -eq $group_id ];then
	echo "Good user."
else
	echo "Bad user."
fi

3多分支结构

语法

if 条件测试1 
	then 命令序列 
		elif 条件测试2 
			then 命令序列 
				elif 条件测试3  
					then 命令序列
	... 
	else 命令序列 
fi

示例
编写脚本,取出系统时间的小时,对数字进行判断
6–10 this is morning
11-13 this is noon
14-18 this is afternoon
其他 this is night

[root@localhost ~]# vim 1.sh
#!/bin/bash
hour=`date +%H`
if [ $hour -ge 6 -a $hour -le 10 ];then
	echo "This is morning"
elif [ $hour -ge 11 -a $hour -le 13 ];then
	echo "This is noon"
elif [ $hour -ge 14 -a $hour -le 18 ];then
	echo "This is afternoon"
else
	echo "This is night"
fi

4.嵌套结构

语法

if 条件测试1	
	then 命令序列 	
		if 条件测试1	
			then 命令序列 	
			else 命令序列 	
		fi 	
	else 命令序列 
fi

示例

[root@localhost ~]# vim 1.sh
read -p "Input username: " name
id $name &> /dev/null
if [  $? -eq 0   ]
	then echo "$name 存在"
	else useradd $name
		 echo "$name create finished" 
read -p "请输入用户密码: "  pass
         if [ ${#pass}  -ge  7  ]
         then echo "$pass" | passwd --stdin $name
              echo "$name 用户密码是 $pass"
         else echo "密码不合格" 
         fi
fi

三.模式匹配:case

1.case语法结构

语法

case 变量 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
模式3)
命令序列3
;;
*)
无匹配后命令序列
esac

示例
编写脚本,由用户输入字符串,
字符串为linux则显示windows,
为windows则显示Linux否则显示Other

[root@localhost ~]# vim 1.sh
#!/bin/bash
read -p "Input string: " str
case $str in
windows)
echo "Linux..."
;;
linux)
echo "Windows..."
;;
*)
echo "Other...."
;;
esac

2.简单的模式匹配

简单的模式匹配
邀请用户输入待删除用户名。
询问用户,确定要继续删除吗 yes/no

[root@localhost ~]# vim 1.sh
#!/bin/bash

#1请输入删除的用户名:

read -p "please input a username : " user

#2输出用户ID

id $user &> /dev/null

#3判断用户是否存在

if [ $? -ne 0 ];then
        echo "no such user:  $user"
        exit 1
fi

#4请用户确认是否删除

read -p "are you sure?[y/n]: " action
if [ "$action" = "y" -o "$action" = "Y" ] ;then
        userdel -r $user
        echo "$user is deleted!"
else
        echo "thank you"
fi
[root@localhost ~]# vim 1.sh
#!/bin/bash

#1请输入删除的用户名:

read -p "please input a username : " user

#2输出用户ID

id $user &> /dev/null

#3判断用户是否存在

if [ $? -ne 0 ];then
        echo "no such user:  $user"
        exit 1
fi

#4请用户确认是否删除

read -p "are you sure?[y/n]: " action
#if [ "$action" = "y" -o "$action" = "Y" ] ;then
#       userdel -r $user
#       echo "$user is deleted!"
#else
#       echo "thank you"
#fi

#5case写法

case "$action" in
Y|y|YES|yes)
userdel -r $user
echo "$user is deleted!"
;;
*)
echo "thank you"
;;
esac

3.简单的jumpserver

跳板主机
1)web1
2)web2
3)web3
h)help
q)exit

[root@localhost ~]# vim jump-server.sh 

#!/bin/bash
web1=10.8.162.66
web2="待分配2"
web3="待分配3"

while : 
do

cat <<EOF
1.web1
2.web2
3.web3
4.quit
5.exit
EOF

read -p "input number:" num

case $num in
1)
ssh root@$web1
;;
2)
ssh root@$web2
;;
3)
ssh root@$web3
;;
4)
quit
;;
5)
exit
;;
*)
echo "no"
esac
done

4.系统管理工具箱

Command action
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序

[root@localhost ~]# vim systemmanage.sh 

#!/bin/bash
cat <<EOF
h.help
f.disk partation
d.filesystem mount
m.memory
u.system load
q.exit
EOF
while :
do
read -p "please input:" action
case "$action" in
f)
fdisk -l
;;
d)
df -hT
;;
m)
free -m
;;
u)
uptime
;;
q)
exit
;;
h)
cat <<EOF
h.help
f.disk partation
d.filesystem mount
m.memory
u.system load
q.exit
EOF
;;
*)
echo "error"
;;
esac
done

四.小结

1.符号总结

() 子shell中执行:		(cd /home;ls)
(()) 比较数值,运算 C语言:	((1<2));echo $?
$() 命令替换,或者反撇``:	touch file$(date)
$(()) 整数运算:			echo $((1+1))
{}集合:			        touch file{1..3}
${}字符串的提取和替换。:	echo ${aaa-111}
[] 条件测试:			    [ -f file1.txt ]; echo $?
[[]] 条件测试,支持正则 :	[[ 12 =~ [0-9]+$  ]] ;echo $?
$[] 整数运算:			echo $[1+1]

2.概念总结

执行脚本:

# ./01.sh <需要执行权限> 在子shell中执行
# bash 01.sh 不需要执行权限 在子shell中执行
# . 01.sh 不需要执行权限 在当前shell中执行
# source 01.sh 不需要执行权限 在当前shell中执行
提示:通常修改系统配置文件中如 /etc/profile 的PATH等变量后,使之在当前shell中生效

调试脚本的其他方法:
# sh -n 02.sh 仅调试脚本中的语法错误。
# sh -vx 02.sh 以调试的方式执行,查询整个执行过程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值