shell编程中
1.1 条件表达式
1.1.1 文件判断
常用文件测试操作符
常用文件测试操作符 |
说明 |
-d文件,d的全拼为directory |
文件存在且为目录则为真,即测试表达式成立 |
-f文件,f的全拼为file |
文件存在且为普通文件则为真,即测试表达式成立 |
-e文件,e的全拼为exist |
文件存在则为真,即测试表达式成立。注意区别于“-f”,-e不辨别是目录还是文件 |
-r文件,r的全拼为read |
文件存在且可读则为真,即测试表达式成立 |
-s文件,s的全拼为size |
文件存在且文件大小不为0则为真,即测试表达式成立 |
-w文件,w的全拼为write |
文件存在且可写则为真,即测试表达式成立 |
-x文件,x的全拼为executable |
文件存在且可执行则为真,即测试表达式成立 |
-L文件,L的全拼为link |
文件存在且为链接文件则为真,即测试表达式成立 |
fl -nt f2,nt 的全拼为 newer than |
文件fl比文件f2新则为真,即测试表达式成立。根据文件的修改时间来计算 |
fl -ot f2,ot 的全拼为 older than |
文件fl比文件f2旧则为真,即测试表达式成立。根据文件的修改时间来计算 |
判断文件是否存在
[root@clsn scripts]# [ -f /etc/hosts ]
[root@clsn scripts]# echo $?
0
[root@clsn scripts]# [ -f /etc/hosts1 ]
[root@clsn scripts]# echo $?
1
判断文件是否存在,返回方式
[root@clsn scripts]# [ -f /etc/hosts ] && echo "文件存在" || echo "文件不存在"
文件存在
[root@clsn scripts]# [ -f /etc/hosts1 ] && echo "文件存在" || echo "文件不存在"
文件不存在
判断目录是否存在
[root@clsn scripts]# [ -d /tmp ] && echo "目录存在" || echo "目录不存在"
目录存在
[root@clsn scripts]# [ -d /tmp1 ] && echo "目录存在" || echo "目录不存在"
目录不存在
使用变量的方法进行判断
dir=/etc1/;[ -d $dir ] && tar zcf etc.tar.gz $dir || echo "$dir目录不存在"
1.1.2 字符串判断
字符串测试操作符
常用字符串测试操作符 |
说明 |
-n “字符串“ |
若字符串的长度不为0,则为真,即测试表达式成立,n可以理解为no zero |
-z “字符串“ |
若字符串的长度为0,则为真,即测试表达式成立,z可以理解为zero的缩写 |
“串 1″== “串 2″ |
若字符串1等于字符串2,则为真,即测试表达式成立,可使用“==”代替“=” |
“串 1″ != “串 2″ |
若字符串1不等于字符串2,则为真,即测试表达式成立,但不能用“!==”代替“!=” |
1.对于字符串的测试,一定要将字符串加双引号之后再进行比较。 2.空格非空 |
-z 判断字符串长度
[root@clsn scripts]# x= ; [ -z "$x" ] && echo "输入为空" || echo '输入有内容'
输入为空
[root@clsn scripts]# x=12 ; [ -z "$x" ] && echo "输入为空" || echo '输入有内容'
输入有内容
-n 判断字符串长度
[root@clsn scripts]# x=12 ; [ -n "$x" ] && echo "输入有内容" || echo '输入为空'
输入有内容
[root@clsn scripts]# x= ; [ -n "$x" ] && echo "输入有内容" || echo '输入为空'
输入为空
“串 1″ == ” 串 2 ” 使用定义变量的方式进行判断
cmd=$1
[ "$cmd" == "start" ] && echo start
# 测试
[root@clsn scripts]# cmd=start;[ "$cmd" == "start" ] && echo start
start
1.1.3 整数判断
整数二元比较操作符参考
在[]以及test中 使用的比较符号 |
在(())和[[]]中 使用的比较符号 |
说明 |
-eq |
==或= |
相等,全拼为equal |
-ne |
!= |
不相等,全拼为not equal |
-gt |
> |
大于,全拼为greater than |
-ge |
>= |
大于等于,全拼为greater equal |
-lt |
< |
小于,全拼为丨ess than |
-le |
<= |
小于等于,全拼为less equal |
判断两数是否相等
[root@clsn scripts]# [ 1 -eq 1 ]
[root@clsn scripts]# echo $?
0
[root@clsn scripts]# [ 1 -eq 2 ]
[root@clsn scripts]# echo $?
1
大于等于
[root@clsn ~]# [ 11 -ge 1 ] && echo "成立" || echo "不成立"
成立
小于
[root@clsn ~]# [ 11 -lt 1 ] && echo "成立" || echo "不成立"
不成立
大于
[root@clsn ~]# [ 11 -gt 1 ] && echo "成立" || echo "不成立"
成立
不等于
[root@clsn ~]# [ 11 -ne 1 ] && echo "成立" || echo "不成立"
成立
1.1.4 逻辑符号
常用逻辑操作符
在[]和test中使用的操作符 |
说明 |
在[[]]和中使用的操作符 |
说明 |
-a |
[ 条件A -a 条件B ] A与B都要成立,整个表达式才成立 |
&& |
and,与,两端都为真, 则结果为真 |
-o |
[ 条件A -o 条件B] A与B都不成立,整个表达式才不成立 |
|| |
or,或,两端有一个为真 ,则结果为真 |
! |
|
! |
not,非,两端相反, 则结果为真 |
逻辑操作符与整数判断配合
[root@clsn ~]# [ 11 -ne 1 ] && echo "成立" || echo "不成立"
成立
取反
[root@clsn ~]# [ ! 11 -ne 1 ] && echo "成立" || echo "不成立"
不成立
两边都为真
[root@clsn ~]# [ 11 -ne 1 -a 1 -eq 1 ] && echo "成立" || echo "不成立"
成立
至少有一边为真
[root@clsn ~]# [ 11 -ne 1 -o 1 -eq 1 ] && echo "成立" || echo "不成立"
成立
感叹号的特殊用法
使用历史命令,感叹号加上history中的序号,即可执行
[root@clsn ~]# !516
ls
anaconda-ks.cfg bootime.avg setup.sh vim
1.1.5 【练习题】开发3个shell脚本比较2个整数大小
要求:
1. 分别以定义变量,脚本传参以及read读入的方式写3个脚本。
2. 用条件表达式(禁止if语句)进行判断。
3. 将2个整数的比较结果输出到屏幕,出错需要提示。
使用定义变量方法
[root@clsn panduan1]# cat panduan1.sh
read -p "Pls input two num:" a b
#1.第一关判断传入的内容都是整数
expr $a + $b + 100 &>/dev/null
[ $? -ne 0 ] &&{
echo "Usage:$0 num1 num2"
exit 1
}
#2.第二关输入两个数
[ -z "$b" ] &&{
echo "Usage:$0 num1 num2"
exit 2
}
#3.比较大小
[ $a -gt $b ] && {
echo "$a>$b"
exit 0
}
[ $a -eq $b ] && {
echo "$a=$b"
exit 0
}
echo "$a<$b"
exit 0
1.2 if条件语句
# 条件表达式和if语句可以互相转换
1.2.1 三种语法
单分支语句
if [ -f /etc/hosts ]
then
echo '文件存在'
fi
双分支语句
if [ -f /etc/hosts ]
then
echo "文件存在"
else
echo "文件不存在"
echo "..." >>/tmp/test.log
fi
多分支语句
if [ -f /etc/hosts ]
then
echo " hosts文件存在"
elif [ -f /etc/host ]
then
echo " host文件存在"
else
bu鸟你
fi
1.2.2 if条件语句小结
单分支:一个条件一个结果
双分支:一个条件两个结果
多分支:多个条件多个结果
1.2.3 输入2个数字,比较大小(使用if语句结合条件表达式实现)
说明:
3个脚本:使用直接赋值,传参,read任一种方法写3种脚本(单分支,双分支,多分支)
示例脚本一:
read -t 15 -p "请输入两个数字:" a b
if [ -z "$b" ]
then
echo "请输入两个数字"
exit 1
fi
expr $a + $b + 1 &>/dev/null
if [[ $? != 0 ]]
then
echo "请输入数字"
exit 2
fi
if [[ $a = $b ]]
then
echo "="
elif [[ $a > $b ]]
then
echo ">"
else
echo "<"
fi
1.2.4 使用read读入的方式写出银行卡账号密码
[root@DB3 scripts]# vim yihang.sh
read -p "请输入银行卡帐号:" a
read -s -p "请输入银行卡密码:" b
expr $a + 1 + $b &>/dev/null
if [[ $? != 0 ]]
then
echo "请输入正确的卡号密码"
exit 1
fi
length=`echo ${#a}`
length2=`echo ${#b}`
if [ $length -ne 10 ]
then
echo "卡号格式错误"
fi
if [ $length2 -ne 6 ]
then
echo "密码格式错误"
fi
1.2.5 系统内存低于100M邮件报警,加入计划任务,3分钟检查一次。
对于开发程序而言,一般来说应该遵循下面的3步法则。
(1)分析需求
明白开发需求,是完成程序的大前提,因此,分析需求至关重要,一切不以需求为主的程序开发,都是耍流氓的!
(2)设计思路
设计思路就是根据需求,把需求进行拆解,分模块逐步实现,例如本题可以分为如下几步:
1)获取当前系统剩余内存的值(先在命令行实现)。
2)配置邮件报警(可采用第三方邮件服务器)。
3)判断取到的值是否小于100MB,如果小于100MB,就报警(采用if语句)。
4)编码实现Shell脚本。
5)加入crond定时任务,每三分钟检查一次。
(3)编码实现
编码实现就是具体的编码及调试过程,工作中很可能需要先在测试环境下调试,调试好了,再发布到生产环境中。
第一步 先配置邮件服务,保证能够发生邮件
发送测试邮件发送
echo "`date +%F_%T`" |mail -s "这是测试邮件" admin@znix.top
第二步编写检查脚本
[root@DB3 scripts]# cat nc.sh
#!/bin/bash
free=` free -m |awk 'NR==3{print $NF}'`
host=`hostname`
ip=`hostname -I`
data=`date +%F-%T`
if [ $free -le 100 ]
then
echo "发生时间:$data" >/tmp/free.log
echo "发生主机:$host $ip" >>/tmp/free.log
echo "内存余量:$free M" >>/tmp/free.log
mail -s "内存不足" 542154983@qq.com </tmp/free.log
fi第三步测试脚本(可以修改判断的值)
[root@clsn scripts]# sh mem_info.sh
第四步 脚本测试成功,写入定时任务
[root@clsn panduan1]# crontab -l
# 检查内存剩余大小
*/3 * * * * /bin/sh /server/scripts/nc.sh &>/dev/null
至此,一个监控脚本就写好了
1.2.6 模拟编写启动nginx脚本
脚本内容
1 [root@clsn scripts]# cat nginx.sh
. /etc/init.d/functions
start(){
nginx_pid_file_path=/application/nginx/logs/nginx.pid
if ! test -s "$nginx_pid_file_path"
then
/application/nginx/sbin/nginx
retval=$?
if [ $retval -eq 0 ]
then
action "nginx start" /bin/true
return $retval
else
action "nginx start" /bin/false
return $retval
fi
else
echo "nginx is started"
fi
}
stop(){
nginx_pid_file_path=/application/nginx/logs/nginx.pid
if test -s "$nginx_pid_file_path"
then
nginx_pid=`cat $nginx_pid_file_path`
if (kill -0 $nginx_pid 2>/dev/null)
then
echo "Shutting down nginx"
kill $nginx_pid
retval=$?
if [ $retval -eq 0 ]
then
action "nginx stop" /bin/true
return $retval
else
action "nginx stop" /bin/false
return $retval
fi
else
echo "ngnix process is not exist."
fi
else
echo "nginx is stopped."
fi
}
case $1 in
start)
start
retval=$?
;;
stop)
stop
retval=$?
;;
restart)
stop
start
retval=$?
;;
*)
echo -e "USAG:$0 {start|stop|restart}"
esac
exit $retval
1.2.7 【练习题5】Web及MySQL服务异常监测案例
用if条件语句实现对Nginx Web服务以及MySQL数据库服务是否正常进行检测,如果服务未启动,则启动相应服务。
脚本编写思路:
判断web服务器正常 ↓
1、进程 ps -ef |grep [n]ginx
2、端口 netstat ss losf telnet nc nmap
3、curl 页面 返回值
4、curl check.html 的内容
判断mysql服务器正常 ↓
1、端口 netstat ss losf telnet nc nmap
2、进程 ps -ef |grep [m]ysql
3、mysql 登录访问看一下
4、mysql insert一个数据 select一个数据
web服务监控脚本示例
1 [root@clsn scripts]# cat web_check.sh
2 #!/bin/bash
3 #############################################################
4 # File Name: web_check.sh
5 # Version: V1.0
6 # Author: clsn
7 # Organization: http://blog.znix.top
8 # Created Time : 2017-12-07 10:53:38
9 # Description:
10 #############################################################
11 . /etc/init.d/functions
12
13 JinChen=`ps -ef |grep -c [n]ginx`
14 QiDong='/server/scripts/nginx.sh start'
15 StatuS=`curl -I -w "%{http_code}\n" -o /dev/null -s 10.0.0.180`
16 StatuS2=`curl -s 10.0.0.180/check.html|grep -c ok`
17 StartNginx='/server/scripts/nginx.sh start'
18
19 if [ $JinChen -ge 2 ]
20 then
21 if [ "$StatuS" -eq 200 ]
22 then
23 if [ "$StatuS2" -eq 1 ]
24 then
25 action "Nginx 服务运行正常" /bin/true
26 else
27 action "请检查chenk.html文件!" /bin/false
28 fi
29 else
30 action "请检查首页文件!" /bin/false
31 fi
32 else
33 action "Nginx 未正常运行!" /bin/false
34 $StartNginx
35 fi
View Code web 监控脚本内容
脚本执行过程:
1.3 函数
1.3.1 函数的作用
函数的作用就是把程序里多次调用相同代码的部分定义成一份,然后起个名字,所有的调用都 只用这名字就可以了,修改代码时,只需要改变函数体内的代码即可。
1.3.2 函数的三种语法
1.Function 函数名(){ # 推荐
指令
Return n
}
2.function函数名{ 不推荐
指令
Return n
}
3.函数名(){ #不用function的方法
指令
Return n
}
1.3.3 执行方法
函数名
1.函数要先定义在使用
2.函数里定义变量用local
3.函数的返回值用return
脚本里返回值用exit返回
函数也可以接参数
4.带参数的函数执行方法,格式如下:
函数名 参数1 参数2
5.函数后接的参数说明
.Shell的位置参数($1 $2……..$# $* $?)都可以作为函数的参数使用
.此时父脚本的参数临时地被函数参数所掩盖或隐藏
.$0比较特殊,他仍然是父脚本的名称
当函数执行完成时原来的命令行脚本的参数既恢复
.函数的参数变量是在函数体里面定义的
1.3.4 格式例子
function oldboy(){
echo "i am oldboy"
}
oldgirl(){
echo "i am girl"
}
oldboy
oldgirl
1.4 case条件结构语句
1.4.1 case语法结构
case "字符串变量" in
值1)
指令1
;;
值2)
指令2
;;
值*)
指令
esac
1.4.2 case与if的对比
case书写方式
case $name in
1)
指令1
;;
2)
指令2
;;
*)
指令
esac
if书写方式
if [ $name == "值1" ]
then
指令1
elif [ $name == "值2" ]
then
指令2
else
指令
fi
1.4.3 case值的书写方式
apple)
echo -e "$RED_COLOR apple $RES"
;;
也可以这样写,输入2种格式找同一个选项
apple|APPLE)
echo -e "$RED_COLOR apple $RES"
;;
1.4.4 case语句小结
😋 case语句就相当于多分支的if语句。case语句的优势是更规范、易读。
😋 case语句适合变量的值少,且为固定的数字或字符串集合。(1,2,3)或(start,stop,restart)。
😋 系统服务启动脚本传参的判断多用case语句,多参考rpcbind/nfs/crond脚本;菜单脚本也可以使用case
1.4.5 使用case编写一个菜单脚本
脚本内容
cat <<EOF
1.110
2.120
3.119
4.112
EOF
read -p "拨打紧急电话:" ww
case $ww in
1)
echo "欢迎拨打110"
;;
2)
echo "欢迎拨打120"
;;
3)
echo "欢迎拨打119"
;;
4)
echo "欢迎拨打112"
;;
*)
echo "请你吃屎"
esac
1.4.6 输出带有颜色的水果菜单
脚本内容:
1 [root@clsn scripts]# cat fruits.sh
#!/bin/bash
cat <<EOF
==============================================
1.apple
2.pear
3.banana
4.exit
=============================================
EOF
read -t 15 -p "要买什么水果:" a
case $a in
1)
echo -e "\033[31m apple \033[0m"
;;
2)
echo -e "\033[32m pear \033[0m"
;;
3)
echo -e "\033[33m banana \033[0m"
;;
4)
exit
esac
View Code 水果菜单脚本
1.4.7 写脚本规范及注意事项
1.变量名称不能和系统已经存在的命令等重复 free == > Free
2. 判断单位要统一
3. 脚本一行不超过一屏的一半。
4. 能写成变量的内容尽量写成变量
1.5 练习题
1.5.1 使用(case)编写rsync管理脚本
写网络服务独立进程模式下Rsync的系统启动脚本,例如:/etc/init.d/rsyncd {start|stop|restart}。
要求:
1.要使用系统函数库技巧。
2.要用函数,不能一坨💩的方式。
3.在centos 6中 可被chkconfig管理。
注意:
服务的停止操作和启动操作之间要有间隔时间,使用sleep 1
pkill 进程
sleep 1
start 服务
touch /etc/rsyncd.conf 测试环境
rsync服务启动脚本
[root@clsn scripts]# cat rsyncd
. /etc/init.d/functions
start(){
rsync_pid_file_path=/var/run/rsync.pid
if ! test -s "$rsync_pid_file_path"
then
rsync --daemon
retval=$?
if [ $retval -eq 0 ]
then
action "rsync start" /bin/true
return $retval
else
action "rsync start" /bin/false
return $retval
fi
else
echo "rsync is started"
fi
}
stop(){
rsync_pid_file_path=/var/run/rsync.pid
if test -s "$rsync_pid_file_path"
then
rsync_pid=`cat $rsync_pid_file_path`
if (kill -0 $rsync_pid 2>/dev/null)
then
echo "Shutting down Rsync"
kill $rsync_pid
retval=$?
if [ $retval -eq 0 ]
then
action "rsync stop" /bin/true
return $retval
else
action "rsync stop" /bin/false
return $retval
fi
else
echo "rsync process is not exist."
fi
else
echo "rsync is stopped."
fi
}
###################
case "$1" in
start)
start
retval=$?
;;
stop)
stop
retval=$?
;;
restart)
stop
sleep 2
start
retval=$?
;;
*)
echo "Usage:$0 {start|stop|restart}"
retval=$?
esac
exit $retval
1.5.2 字符数大于6的单词打印出来。
Functions that accept file name arguments usually detect these
word="Functions that accept file name arguments usually detect these"
for char in $word
do
if [ `expr length "$char"` -gt 6 ]
then
echo $char
fi
done
1.5.3 菜单自动化软件部署脚本实践
综合实例:打印选择菜单,按照选择一键安装不同的Web服务。
示例菜单:
[root@oldboy scripts]# sh menu.sh
1.[install lamp]
2.[install lnmp]
3.[exit]
pls input the num you want:
要求:
1、当用户输入1时,输出“start installing lamp.提示”然后执行/server/scripts/lamp.sh,脚本内容输出"lampis installed"后退出脚本,工作中就是正式lamp一键安装脚本;
echo 'echo lampis installed' > /server/scripts/lamp.sh
chmod +x /server/scripts/lamp.sh
2、当用户输入2时,输出“start installing lnmp.提示” 然后执行/server/scripts/lnmp.sh输出"lnmpis installed"后退出脚本,工作中就是正式lnmp一键安装脚本;
echo 'echo lnmpis installed' > /server/scripts/lnmp.sh
chmod +x /server/scripts/lnmp.sh
3、当输入3时,退出当前菜单及脚本;
4、当输入任何其它字符,给出提示“Input error”后退出脚本;
5、要对执行的脚本进行相关的条件判断,例如:脚本文件是否存在,是否可执行等判断。
脚本 内容
1 [root@clsn scripts]# cat menu.sh
#!/bin/bash
cat <<EOF
1.[install lamp]
2.[install lnmp]
3.[exit]
EOF
read -p "please input the num you want:" Num
case "$Num" in
1)
if [ -f /server/scripts/lamp.sh ]
then
echo -e "\033[36mstart installing lamp\033[0m"
/server/scripts/lamp.sh
else
echo -e "\033[5;41;37m /server/scripts/lamp.sh 文件不存在 \033[0m"
fi
;;
2)
if [ -f /server/scripts/lnmp.sh ]
then
echo -e "\033[36mstart installing lnmp\033[0m"
/server/scripts/lnmp.sh
else
echo -e "\033[5;41;37m /server/scripts/lnmp.sh 文件不存在 \033[0m"
fi
;;
3)
exit
;;
*)
echo -e "\033[31mInput error \033[0m"
exit 2
esac
View Code 自动化软件部署脚本
执行过程
1.5.4 {1..100}相加
sum=0
for ((i=1;i<101;i++))
do
let sum=sum+i
done
echo $sum
[root@db03 scripts]# n=1000000000
[root@db03 scripts]# echo $((n*(n+1)/2))
500000000500000000
1.5.5 if 与 case 对比
if 语句类似黑名单,需要把这种错误场景封堵
case 语句类似白名单,只要把正确结果列完整即可
1.6 其他补充说明
1.6.1 linux中产生随机数的方法
[root@clsn scripts]# echo $RANDOM
29291
[root@clsn scripts]# echo $RANDOM
5560
[root@clsn scripts]# echo $RANDOM
2904
1.6.2 1.5.2 echo 命令输出带颜色字符
# 彩色字体
echo -e "\033[30m 黑色字 clsn \033[0m"
echo -e "\033[31m 红色字 clsn \033[0m"
echo -e "\033[32m 绿色字 clsn \033[0m"
echo -e "\033[33m 黄色字 clsn \033[0m"
echo -e "\033[34m 蓝色字 clsn \033[0m"
echo -e "\033[35m 紫色字 clsn \033[0m"
echo -e "\033[36m 天蓝字 clsn \033[0m"
echo -e "\033[37m 白色字 clsn \033[0m"
效果示意图
# 彩色底纹
echo -e "\033[40;37m 黑底白字 clsn \033[0m"
echo -e "\033[41;37m 红底白字 clsn \033[0m"
echo -e "\033[42;37m 绿底白字 clsn \033[0m"
echo -e "\033[43;37m 黄底白字 clsn \033[0m"
echo -e "\033[44;37m 蓝底白字 clsn \033[0m"
echo -e "\033[45;37m 紫底白字 clsn \033[0m"
echo -e "\033[46;37m 天蓝白字 clsn \033[0m
效果示意图
# 特效字体
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m — \033[37m 设置前景色
\033[40m — \033[47m 设置背景色
\033[nA 光标上移 n 行
\033[nB 光标下移 n 行
\033[nC 光标右移 n 行
\033[nD 光标左移 n 行
\033[y;xH 设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
部分效果示意图
1.6.3 1.5.3 显示文本中的隐藏字符
使用cat命令查看文本中的隐藏字符
[root@clsn ~]# cat --help
用法:cat [选项]... [文件]...
将[文件]或标准输入组合输出到标准输出。
-A, --show-all 等于-vET
-b, --number-nonblank 对非空输出行编号
-e 等于-vE
-E, --show-ends 在每行结束处显示"$"
-n, --number 对输出的所有行编号
-s, --squeeze-blank 不输出多行空行
-t 与-vT 等价
-T, --show-tabs 将跳格字符显示为^I
-u (被忽略)
-v, --show-nonprinting 使用^ 和M- 引用,除了LFD和 TAB 之外
使用cat -A查看隐藏的字符
[root@clsn ~]# cat -A /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4$
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6$
10.0.0.1 mirrors.aliyuncs.com mirrors.aliyun.com$
10.0.0.180 clsn$
关于隐藏字符常见错误
在windows中编写的脚本换行使用的是 \r\n
但是在linux中使用\n 进行换行
[root@clsn ~]# cat -A windowe.sh
n1=2^M$
n2=1^M$
^M$
[ $n1 -gt $n2 ] && echo "$n1 > $n2" && exit^M$
[ $n1 -eq $n2 ] && echo "$n1 = $n2" && exit^M$
echo "$n1 < $n2"^M$
使用dos2unix 把windows上的脚本转化linux格式
[root@clsn ~]# dos2unix windowe.sh
dos2unix: converting file windowe.sh to Unix format ...
转换后,脚本的内容隐藏内容改变。
[root@clsn ~]# cat -A windowe.sh
n1=2$
n2=1$
$
[ $n1 -gt $n2 ] && echo "$n1 > $n2" && exit$
[ $n1 -eq $n2 ] && echo "$n1 = $n2" && exit$
echo "$n1 < $n2"$
1.6.4 1.5.4 排错技巧
sh -x 脚本.sh
-x 开启脚本调试模式
cat -A 文件.txt
-A 查看文件的隐藏字符
1.6.5 1.5.5 shell 脚本段注释方法
方法一:
<<EOF
内容
EOF
方法二:
一行注释方法 → : '内容'
段注释方法 ↓
:'
http://blog.znix.top
'
:命令的说明
[root@clsn scripts]# help :
:: :
空的命令。
没有效果; 此命令不做任何操作。
退出状态:
总是成功。
:命令的应用场景
if 条件
then
:
else
命令
fi
1.6.6 1.5.6 其他补充
类进度条效果
yum install -y pv
echo {1..20}|pv -qL 15
clear 命令
清屏 == ctrl + l
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?