$符后接括号类型:
${}:避免变量失效, $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 终止当前循环,继续执行下一次循环