2023年8月2日发(作者:)
shell脚本:if判断、case语句、循环、函数、数组if判断if语句分为单分⽀、双分⽀、多分枝。如果判断前⾯执⾏的命令成⽴则执⾏后⾯的命令,通常与test测试⼀起使⽤,if判断的标准是if执⾏的命令的返回值是否为0,当命令执⾏成功时返回⼀个0,如果不成功返回⼀个⾮0实数,返回值可以通过echo $?查看,返回值也可以⼿动修改。if [ a < b ] 单分⽀,如果返回值为0也就是if后的命令执⾏成功,那么执⾏echo 1then echo 1fiif [ a == b ] 双分⽀,如果返回值为0执⾏echo 2,不为0执⾏echo 3then echo 2else echo 3fiif [ a > b ] 多分⽀,如果返回值为0执⾏echo 4,不为0交给下⼀个elif进⾏判断,返回值为0则执⾏echo 5,不为0执⾏echo 6then echo 4elif echo 5else echo 6fi在if多分⽀中,对if后执⾏的命令进⾏判断,然后按照elif的顺序依次进⾏判断,最后得出结果,elif可以有任意个数,想创建多少个创建多少个。if语句的应⽤read -p "请输⼊ip地址或域名:" IP 检查某个ip地址是否能连通,如果能ping通,显⽰is up 如果ping不通,显⽰is downping -c 5 $IP >> /dev/nullif [ $? -eq 0 ]then echo is upelse echo is downfiread -p "请输⼊⽤户名:" USER 查看某个⽤户是否存在,如果存在就显⽰已存在,不存在就创建该⽤户id $USER &>> /dev/nullif [ $? -eq 0 ]then echo "已存在"else
useradd $USER &>> /dev/null echo "123" | passwd --stdin $USER &>> /dev/null echo "⽤户已建⽴"firead -p "请输⼊年份:" YEAR 查看某⼀年是不是闰年,这⾥的思路是如果某⼀年的天数是366天,那么是闰年,如果是365天,那么不是闰年year=`date -d "$YEAR"1231 +%j` date -d "$YEAR"1231 +%j是显⽰12⽉31⽇是今年的第⼏天if [ $year -eq 366 ]then echo ""$YEAR"是闰年"else echo ""$YEAR"不是闰年"ficase语句case语句为多选择语句。可以⽤case语句匹配⼀个值与⼀个模式,如果匹配成功,执⾏相匹配的命令然后结束这个case。case需要⼀个esac(就是case反过来)作为结束标记,每个case分⽀⽤右圆括号,⽤两个分号表⽰break,其中“;;”不是跳出循环,是不在去匹配下⾯的模式。case、if包括后⾯要说的for、while等都可以互相嵌套。case语句的应⽤read -p "请输⼊想要操作的服务:" system 控制服务的重启,停⽌,启动read -p "请输⼊想要进⾏的操作(英⽂):" operatecase $operate instart)systemctl start "$system";echo "服务已启动";;restart)systemctl restart "$system";echo "服务已重启";;stop)systemctl stop "$system";echo "服务已停⽌";;esacsystemctl status "$system" 显⽰这个服务的状态read -p "⽯头剪⼑布:" mora ⽯头剪⼑布的⼈机对战 这⾥是case中嵌套ifif [ $mora == 布 ] 思路是将随机数$RANDOM进⾏除以3得余数,得出0,1,2,给0,1,2定义⽯头剪⼑和布,并赋予⾃⼰输⼊的⽯头剪⼑布0,1,2的值,然后对值进⾏⽐⼤⼩then 有些⼈可能会考虑到随机数每次都随机取值⽆法对值进⾏固定,所以要通过⼀个变量来将随机数的值进⾏固定 bu=2 ⽤变量固定随机数的值后,除⾮再次对变量进⾏赋值,否侧⼀直是这个值elif [ $mora == ⽯头 ]then bu=1elif [ $mora == 剪⼑ ]then bu=0fijiandao=`echo $[$RANDOM%3]`case $mora in0)if [ $bu -eq 0 ]
then echo "平局"elif [ $bu -eq 1 ]then echo "获胜"elif [ $bu -eq 2 ]then echo "失败"fi;;1)if [ $bu -eq 0 ]then echo "失败"elif [ $bu -eq 1 ]then echo "平局"elif [ $bu -eq 2 ]then echo "获胜"fi;;2)if [ $bu -eq 0 ]then echo "获胜"elif [ $bu -eq 1 ]then echo "失败"elif [ $bu -eq 2 ]then echo "平局"fi;;esacfor循环for循环对⼀个变量的不同值分别执⾏⼀次命令,当把变量的不同值全部带⼊并执⾏⼀次后,循环结束,for循环有多种写吧,每种写法在⼤致的意思⼀样,但是在细节表⽰上不完全相同,有⼀点需要注意,for循环只是对变量的不同值执⾏命令,执⾏的命令可以没有这个变量,与变量的值没有⼀点关系,虽然通常都需要使⽤到前⾯的变量。for中可以嵌套其他语句。for循环的格式第⼀种:for i in 1 2 3或for i in {1..3} 当i=1,i=2,i=3执⾏下⾯的命令,{1..3}这⾥的..表⽰1到3do
命令序列done第⼆种:for i in `seq 214` seq 3表⽰从1开始直到214,每个数字都带⼊前⾯的变量⼀次do 命令序列done第三种:for ((i=1;i<=214;i++)) ⾸先给i定⼀个初始值,然后对i进⾏判定,如果i的值符合判定则执⾏下⾯的命令,执⾏完后,i++直到判定不符合,循环完毕do 命令序列donefor循环的应⽤read -p "输⼊菱形的规格:" ling 制作菱形 for ((i=1;i<=$ling;i++)) do
for ((j=$ling;j>i;j--)) do echo -en " " done for ((n=1;n<=$i;n++)) do echo -en "* " done echo donefor ((i=1;i<=$ling;i++))dofor ((j=1;j<=$i;j++))doecho -en " "
donefor ((n=$ling;n>i;n--))doecho -en "* "doneechodonefor ((a=1;a<10;a++)) 制作99乘法表dofor ((b=1;b<=a;b++))doc=$[a*b]echo -en ""$a"x"$b"="$c"t"doneechodonewhile循环对⼀个条件进⾏判断,如果判定通过则执⾏命令,执⾏完后,返回while继续进⾏判定,如果不成功则循环结束。while循环格式while 进⾏的判定⽐如[ 5 -lt 10 ]do命令donewhile循环的应⽤#!/bin/bash
i=1sum=0while [ $i -le 100 ] 求100以内的偶数和do if [ $((i%2)) -eq 0 ];then let sum=$i+$sum filet i++doneecho $sum函数函数实际上相当于在命令外⾯套了⼀层壳,然后给这层壳定义⼀个名字,对这个名字进⾏调⽤的时候会执⾏⾥⾯的命令,有点类似于别名,通常⽤于某些命令要重复多次写⼊时,定义⼀个函数名来减少⼯作量。函数没有什么⼤的注意事项,唯⼀需要注意的是在函数种使⽤位置变量的时候。当我们使⽤位置参数执⾏脚本时,此时,位置参数的作⽤范围是这个脚本,⽽脚本中的函数并不感知,所以可能有些时候写脚本执⾏的时候会报错。所以如果要使⽤位置参数,不仅执⾏脚本后⾯要跟位置参数,调⽤函数时,后⾯也要添加位置参数。如果出现相同函数名时,前⾯的函数会被后⾯的函数覆盖掉关于函数中的变量,函数⾥的变量尽量不跟脚本⾥的变量相同,不然会可能会发⽣冲突等等,如果硬要写成同⼀个变量,在函数中变量的前⾯加上local,表⽰这是⼀个本地变量,只在函数中应⽤。函数中也可以嵌套函数,也可以通过source 或者.调⽤其他脚本中的函数。函数的格式函数名(){ 应⽤的时候把对应的命令替换成函数名就⾏了命令序列
}数组数组,就是多个元素组成的⼀个合集,数组通常运⽤于循环中。a=(1 2 3 4 5) 定义⼀个数组declare -a 查看所有数组,数组的下标是从0开始的echo ${a[1]} 将数组中的元素打印出来echo ${a[*]} 将数组中所有的元素打印出来echo ${#a[@]} 查看数组有多少个元素echo ${!a[@]} 查看数组的每⼀个元素的下标echo ${a[*]:1:3} 从第⼏个元素开始往后取多少个元素a[3]=asd 通过这种⽅式更改数组中的元素unset a[4] 删除数组中的第五个元素
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690913862a462034.html
评论列表(0条)