SHELL 条件,循环语句

it2023-05-03  72

$符后接括号类型:

${}:避免变量失效, $a 后如果要加字符,直接写的时候 $ 会辨识不到a ,此时要给a加个{ }, ${a}RMB $[]: 运算, $[1+1] $(): 使用命令,a=date:命令直接赋给变量是不可以的,a=$[date],此时是可以赋值给a,用波浪号上的另一个小点符号也可以

if分支有三种:

1,if单分支 if 条件测试; then //如果条件测试成功,那就执行下面的所有指令(指令可以有很多) 指令 fi 2,if双分支 if 条件测试; then //如果条件测试成功,那就执行下面的指令 指令 else //如果上述条件测试失败,那就执行下面的指令3、4 指令 fi 3,if多分支,适合更复杂的情况,结果会有很多的情况 if 条件测试; then //首先判断,条件测试成功,就执行指令 指令 elif 条件测试; then //上述测试失败,此处测试成功的话就执行指令 指令 else //上述测试都失败的话就执行指令 指令 fi

举个栗子:

ping命令应用在脚本中可以使用的选项: ping -c ping次数 -i ping间隔时间(单位:秒) -W 如果ping不通,多久反馈结果(单位:秒) ip地址:ping -c 3 -i 0.1 -W 1 127.0.0.1 练习:编写脚本测试某ip是否能ping通,但不要显示过程,仅仅显示通了或者不通即可 ping -c 3 -i 0.1 -W 1 192.168.4.7 &> /dev/null //ping的具体过程扔黑洞不看 if [ $? -eq 0 ];then //仅仅使用$?可以判断上面的任务是否成功,如果等于0就是成功 echo "通了" else echo "不通" fi

for循环 可以定义循环次数,有限的循环

for 变量名 in 值1 值2 值3 do 指令 done

举个栗子:

seq命令可以帮我们创建数字序列, seq 10 : 输出 1 到 10 #!/bin/bash a=100 for i in $(seq $a) #循环100次,支持变量,seq命令可以帮我们创建数字序列,对于for循环来说,就是可以当是多个值 do echo "nb" echo "$i" done

while循环 可以根据条件测试决定循环次数,可以实现无限循环

while 条件测试 #另外如果想故意创造一个无限循环可以在while后面写冒号即可 do 指令 done

举个栗子:

RANDOM 练习:使用while编写猜数脚本 #!/bin/bash x=$[RANDOM%100] //RANDOM是可以得到随机数的变量,除以100取余数可以得到零到99之间的随机数,并且存到变量x中 y=0 //这里还可以定义猜的次数,一次没猜时是0次 while : //无限循环 do let y++ //每猜一次,把y+1 read -p "请输入一个整数(0-99):" n //将用户给的数字存到变量n中 if [ $n -eq$x ];then //使用if多分枝加条件测试判断n是否等于x echo "恭喜!猜对了!猜了$y次" //如果n等于x就喊出这句话 exit elif [ $n -gt $x ];then //如果n比x大 echo "猜大了!" else //还有最后一种情况 echo "猜小了!" fi done

case分支:功能类似if,不如if强大,语句比较精简

case 调用变量名 in //如果调用的变量内容与下面某个模式一致,就执行模式下面的指令 模式1) //这里的模式可以有很多 执行指令 ;; //指令需要用双分号结尾,如果一个模式有多个指令,那只需在该模式的最后一条指令后加双分号即可 模式2) 执行指令 ;; … *) //如果上述模式都没有被匹配,那就匹配这个 执行指令 esac

举个栗子:

1. 测试case分支的实际应用 #!/bin/bash case $1 in //使用执行脚本后的第1个位置变量作为匹配对象 t|T|tt) //如果$1是t或者T或者tt,都可以算匹配 touch $2;; //此处是创建文件的命令,后面是第二个位置变量的参数 m|M|mm) mkdir $2;; r) rm -rf $2;; *) echo "请输入t|m|r" esac

函数:

函数,可以将公共的语句块使用一个函数名来定义,方便后期反复调用,达到精简脚本,增加可读性的目的 vi test.sh #!/bin/bash a() { //定义函数 echo abc echo xyz } a //调用函数,相当于执行上述两个echo任务 a //可以反复调用 #bash test.sh

NGINX相关:

源码安装nginx 将源码包导入到/root目录下,解压到/root目录下,编译,安装 netstat命令可以查看系统中启动的端口信息,该命令常用选项如下: -n以数字格式显示端口号 -t显示TCP连接的端口 -u显示UDP连接的端口 -l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口 -p显示监听端口的服务名称是什么(也就是程序名称) netstat –luntp | grep nginx //查看nginx的详细信息 在nginx中修改输出文字的颜色,可以使用下列方式: echo -e "\033[32mX\033[0m" //-e选项可以激活后面特殊字符的作用,相当于使用echo的扩展功能,\033[32m代表设置颜色为绿色,X是输入内容,\033[0m代表还原颜色。 栗子: vi test01.sh #!/bin/bash a() { //定义函数 echo -e "\033[$1m$2\033[0m" //输出不同颜色的文本内容,并加入位置变量 } a 31 ABCD //调用时函数后面可以写位置变量的内容,31(红色)就是$1 ABCD是$2 #bash test01.sh

举个大栗子:

编写脚本,使用case分支控制nginx服务 #!/bin/bash case $1 in //使用执行脚本后的第1个位置变量作为匹配对象 s|start|kai) //如果$1是s或start或kai ,那么就执行以下指令 netstat -ntulp | grep -q nginx //查询有没有开启nginx服务, -q是不输出查询结果 [ $? -eq 0 ] && echo "nginx已经开启" && exit //判断如果开了nginx就退出 /usr/local/nginx/sbin/nginx;; //如果没开nginx就开启 stop|guan) / /如果$1是stop或guan,那么就执行以下指令 /usr/local/nginx/sbin/nginx -s stop;; //关闭nginx restart|cq) //如果$1是restart或cq,那么就执行以下指令 /usr/local/nginx/sbin/nginx -s stop //关闭nginx /usr/local/nginx/sbin/nginx;; //开启nginx,此处相当于重启nginx status|cx) //如果$1是status或cx,那么就执行以下指令 netstat -ntulp | grep -q nginx //查询有没有开启nginx服务, -q是不输出查询结果 [ $? -eq 0 ] && echo "nginx正在运行中。。" || echo "nginx未开启";; //根据查询结果输出nginx正在运行或者nginx未开启的提示 *) echo "start|stop|restart" //如果没有匹配任何模式就是喊出使用该脚本的提示,告诉使用者$1应该敲啥,而不能随意敲。 esac //结尾,固定语法,不能少

循环的控制:

通常,在执行循环任务中途如果想退出可以用exit指令,但该指令不但会退出循环,连同脚本也会一并退出,此时可以使用break与continue指令更精细的控制循环。 exit 可以终止循环,但同时退出脚本,如果循环之后还有任务则无法执行 break 终止循环,继续执行循环之后的任务 continue 终止当前循环,继续执行下一次循环
最新回复(0)