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

tech2024-07-10  14

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

一.shell条件测试1.1格式1.2文件测试[ 操作符 文件或目录 ]1.3数值比较[ 整数1 操作符 整数2 ]1.4字符串比较[ "字符串" = "字符串" ]1.5and和or 二.流程控制:if1.单分支结构2.双分支结构3多分支结构4.嵌套结构 三.模式匹配:case1.case语法结构2.简单的模式匹配3.简单的jumpserver4.系统管理工具箱 四.小结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语言风格 [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)