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

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

  • 一.shell条件测试
    • 1.1格式
    • 1.2文件测试[ 操作符 文件或目录 ]
    • 1.3数值比较[ 整数1 操作符 整数2 ]
    • 1.4字符串比较[ "字符串" = "字符串" ]
    • 1.5and和or
  • 二.流程控制:if
    • 1.单分支结构
    • 2.双分支结构
    • 3多分支结构
    • 4.嵌套结构
  • 三.模式匹配:case
    • 1.case语法结构
    • 2.简单的模式匹配
    • 3.简单的jumpserver
    • 4.系统管理工具箱
  • 四.小结
    • 1.符号总结
    • 2.概念总结

一.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语言风格
    Linux系统Shell编程及自动化运维实现-判断_第1张图片
[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
  • 示例
    Linux系统Shell编程及自动化运维实现-判断_第2张图片
[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 <.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 <.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 <.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 以调试的方式执行,查询整个执行过程

你可能感兴趣的:(Linux,Shell编程及自动化运维实现,运维,shell,linux)