格式1:test 条件表达式
格式2:[ 条件表达式 ] 条件表达式前后都有空格
格式3:[[ 条件表达式 ]] 条件表达式前后都有空格,支持正则表达式
格式:[ 操作符 文件 ]
文件测试常用参数
[root@localhost ~]# [[ -d /home ]] && echo $?
0
[root@localhost ~]# [ -d /home ] && echo $?
0
[root@localhost ~]# test -d /home &&echo $?
0
[root@localhost ~]# [ ! -d /ccc ] && mkdir /ccc
示例:
[root@localhoat ~]# id -u
0
[root@localhost ~]# [ $(id -u) -eq 0 ] && echo "当前是超级用户"
当前是超级用户
[alice@localhost ~]$ [ $UID -eq 0 ] && echo "当前是超级用户" || echo "you不是超级用户"
you不是超级用户C语言风格的数值比较(了解)
[root&#64;localhost ~]# ((1<2));echo $?
0
[root&#64;localhost ~]# ((1&#61;&#61;2));echo $?
1
[root&#64;localhost ~]# ((1>2));echo $?
1
[root&#64;localhost ~]# ((1>&#61;2));echo $?
1
[root&#64;localhost ~]# ((1<&#61;2));echo $?
0
[root&#64;localhost ~]# ((1!&#61;2));echo $?
0
[root&#64;localhost ~]# ((&#96;id -u&#96;>0));echo $?
1
[root&#64;localhost ~]# (($UID&#61;&#61;0));echo $?
0
字符串比较时要加双引号
[root&#64;localhost ~]# [ "$USER" &#61; "root" ];echo $?
0
[root&#64;localhost ~]# [ "$USER" &#61;&#61; "root" ];echo $?
0
注意&#xff1a;
""&#xff1a;弱引用&#xff0c;可以实现变量和命令的替换
[root&#64;localhost ~]# x&#61;*
[root&#64;localhost ~]# echo "$x"
*
&#39;&#39;&#xff1a;强引用&#xff0c;不完成变量替换
[root&#64;localhost ~]# x&#61;*
[root&#64;localhost ~]# echo &#39;$x&#39;$x
扩展&#xff1a;判断变量字符串是否为空
-z&#xff1a;变量字符串为空&#xff0c;返回值0
-n&#xff1a;变量字符串不为空&#xff0c;返回值0
[root&#64;localhost ~]# var1&#61;111
[root&#64;localhost ~]# var2&#61;
[root&#64;localhost ~]# //var3变量没有定义
[root&#64;localhost ~]# echo ${#var1} #显示变量中字符串的个数
3
[root&#64;localhost ~]# echo ${#var2}
0
[root&#64;localhost ~]# echo ${#var3}
0
[root&#64;localhost ~]# [ -z "$var1" ];echo $? //-z 变量字符串为空
1
[root&#64;localhost ~]# [ -z "$var2" ];echo $?
0
[root&#64;localhost ~]# [ -z "$var3" ];echo $?
0
[root&#64;localhost ~]# [ -n "$var1" ];echo $? //-n 变量字符串不为空
0
[root&#64;localhost ~]# [ -n "$var2" ];echo $?
1
[root&#64;localhost ~]# [ -n "$var3" ];echo $?
1
在一个shell脚本中的命令执行顺序称作脚本的流。大多数脚本会根据一个或多个条件来改变它们的流。
流控制命令&#xff1a;能让脚本的流根据条件而改变的命令称为条件流控制命令
exit语句&#xff1a;退出程序的执行&#xff0c;并返回一个返回码&#xff0c;返回码为0正常退出&#xff0c;非0为非正常退出
单分支结构
条件判断语法&#xff1a;
if [判断条件]---代码返回0表示真&#xff0c;非0为假if 条件测试
then 命令序列
fiif [ condition ];thencommandcommand
fiif test 条件;then命令
fiif [[ 条件 ]];then命令
fi
双分支结构
if 条件测试
then 命令序列
else 命令序列
fiif [ 1 -eq 2 ];thenecho 不可能
elseecho 不等于
fi
多分支结构
if 条件测试1
then 命令序列[elif 条件测试2
then 命令序列elif 条件测试3
then 命令序列]...else 命令序列
fi
层层嵌套结构
if [ condition1 ];thencommand1 if [ condition2 ];thencommand2fielseif [ condition3 ];thencommand3elif [ condition4 ];thencommand4elsecommand5fi
fi如果条件1满足&#xff0c;执行命令1&#xff1b;如果条件2也满足执行命令2&#xff0c;如果不满足就只执行命令1结束&#xff1b;
如果条件1不满足&#xff0c;不看条件2&#xff1b;直接看条件3&#xff0c;如果条件3满足执行命令3&#xff1b;如果不满足则看条件4&#xff0c;如果条件4满足执行命令4&#xff1b;否则执行命令
语法结构&#xff1a;for i in {范围}
for i in {取值范围} #for是关键字 i是变量名 in是关键字
do #循环体的开始循环体
done #循环体的结束for语句需要定义一个变量和取值范围&#xff0c;根据不同的变量值值执行相同的命令&#xff0c;直到变量值用完。
两种格式
c语言风格
for ((i&#61;1; i<&#61;100; i&#43;&#43;)) 初值;条件;自增
doecho $i
donei&#43;&#43;&#61;&#61;&#61;先赋值再运算
&#43;&#43;i&#61;&#61;&#61;先运算再赋值&#xff08;1&#xff09;i&#43;&#43;实例&#xff1a;
for (( i&#61;1;i <&#61; 5;i&#43;&#43; ))
dolet x&#61;i&#43;&#43; i&#xff1a;2 4 6echo $i x: 1 3 5echo $x
done&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#xff08;2&#xff09;&#43;&#43;i实例&#xff1a;
for (( i&#61;1;i <&#61; 5;&#43;&#43;i ))
dolet x&#61;&#43;&#43;i i&#xff1a;2 4 6echo $i x: 2 4 6 echo $x
donepython风格
for i in {1..100}
doecho $i
done另一种写法&#xff1a;seq的使用
for i in $(seq 1 100) seq 1 100&#61;1-100
doecho $i
done
案例
批量添加账户&#xff1a;
#!/usr/bin/env bash
#批量添加账户
for i in {30..40}douseradd user$i && echo "123" | passwd --stdin user$i &>/dev/nullif [ $? -eq 0 ];thenecho "账户 user$i 添加成功"elseecho "账户 user$i 添加失败"fidone批量删除账户&#xff1a;
#!/usr/bin/env bash
#批量删除账户
for i in {30..40}douserdel -r user$i &>/dev/null[ $? -eq 0 ] && echo "账户 user$i 删除成功" || echo "账户 user$i 删除失败"done
不断重复的执行循环体中的语句&#xff0c;直到某个条件成立
while语句结构
while 条件测试
do循环体
done
当条件测试成立&#xff08;条件测试为真&#xff09;&#xff0c;执行循环体until语法结构
until 条件测试
do循环体
done
当条件测试成立&#xff08;条件测试为假&#xff09;&#xff0c;执行循环体
案例
#!/bin/bash
i&#61;1
until [ "$i" -eq 21 ]
douserdel -r user$ilet i&#43;&#43;
done案例
echo "please enter a number between 5 and 10 :"
read var
while [[ $var !&#61; 0 ]]
doif [ "$var" -lt 5 ] thenecho "Too smail , Try again"read varelif [ "$var" -gt 10 ]then echo "Too big , Try again"read varelseecho "Congratulation! You are right."exit 0;fi
done
case 语法结构
case $变量 inpattern1)list1;; ---------------------结尾。pattern2)list2;;... ...patternN)listN;;*) --------------------> 如果前面命令没有执行成功那么执行下面这个list*;;
esac命令;;表明流应该跳转到case语句的最后&#xff0c;类似C语言中的break指令。
第一行: 声明case关键字调用case语法, 紧跟的“变量”一般为用户的输入值, in代表从下方的各个模式进行匹配
第2-4行: 匹配到“pattern1”后进行命令的输出或执行, pattern1: 一般为字符或数值
第11-12行: 当用户输入的字符不存在匹配模式时, 直接执行或打印*)下的命令或语句
示例
#!/usr/bin/env bash
cat <<-EOF
&#43;-------------------------------------------------------------------------&#43;
| System_tools V1.0 |
&#43;-------------------------------------------------------------------------&#43;
| a. Stop And Disabled Firewalld. |
| b. Disabled SELinux Secure System. |
| c. Install Apache Service. |
| d. Quit |
&#43;-------------------------------------------------------------------------&#43;
EOF
echo "Please input your select: " && read var
case "$var" in"a")systemctl stop firewalld && systemctl disable firewalld;; "b")setenforce 0;; "c")yum -y install httpd httpd-tools;; "d")exit;; *)printf "请按照上方提供的选项输入!!!\n";;
esac可以搭配while循环增强脚本可用性
break&#xff1a;在语句块执行过程中终止循环&#xff0c;并且跳出整个循环
contiue&#xff1a;在语句块执行过程中终止当前循环&#xff0c;跳出该次循环&#xff0c;执行下一次循环。
exit&#xff1a;在语句块执行过程中退出脚本
printf 使用引用文本或空格分隔的参数&#xff0c;外面可以在 printf 中使用格式化字符串&#xff0c;还可以制定字符串的宽度、左右对齐方式等。使用 printf 的脚本比使用 echo 移植性好。
语法格式&#xff1a;printf format-string [arguments...]
• format-string: 为格式控制字符串
• arguments: 为参数列表。$ echo "Hello, Shell"
Hello, Shell$printf "Hello, Shell" $ printf "Hello, Shell\n"
Hello, Shell vim printf.sh
#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 张三 男 66.1234
printf "%-10s %-8s %-4.2f\n" 李四 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876%s %f都是格式替代符
%-10s 指一个宽度为10个字符&#xff08;-表示左对齐&#xff0c;没有则表示右对齐&#xff09;&#xff0c;任何字符都会被显示在10个字符宽的字符内&#xff0c;如果不足则自动以空格填充&#xff0c;超过也会将内容全部显示出来。
%-4.2f 指格式化为小数&#xff0c;其中.2指保留2位小数。- 左/右对齐
字符串&#xff1a;%s
小数&#xff1a;%f
数字&#xff1a;%d
shell脚本中echo显示内容带颜色显示&#xff0c;需要使用到-e参数
格式1&#xff1a;echo -e “\033[背景颜色;字体颜色m 要输出的字符 \033[0m”
格式2&#xff1a;echo -e “\e[背景颜色;字体颜色m 要输出的字符 \e[0m”echo -e “\033[30m 黑色字 \033[0m”
echo -e “\033[31m 红色字 \033[0m”
echo -e “\033[32m 绿色字 \033[0m”
echo -e “\033[33m 黄色字 \033[0m”
echo -e “\033[34m 蓝色字 \033[0m”
echo -e “\033[35m 紫色字 \033[0m”
echo -e “\033[36m 天蓝字 \033[0m”
echo -e “\033[37m 白色字 \033[0m”
echo -e “\033[40;37m 黑底白字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
echo -e “\033[42;37m 绿底白字 \033[0m”
echo -e “\033[43;37m 黄底白字 \033[0m”
echo -e “\033[44;37m 蓝底白字 \033[0m”
echo -e “\033[45;37m 紫底白字 \033[0m”
echo -e “\033[46;37m 天蓝底白字 \033[0m”
echo -e “\033[47;30m 白底黑字 \033[0m”控制选项&#xff1a;
\033[0m&#xff1a;关闭所有属性
\033[1m&#xff1a;高亮显示&#xff0c;加粗
\033[5m&#xff1a;闪烁