10分钟入门Shell脚本编程(shell脚本编程工具)
nanshan 2024-10-29 14:48 9 浏览 0 评论
前言
写下这篇文章,是对自己在学习和使用过程中的总结,文笔不是很好,如果有什么问题欢迎沟通交流
Shell是什么
Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务, Shell脚本(shell script),是一种为Shell编写的脚本程序。我们经常说的shell通常都是指shell脚本。
环境和工具
Shell跟java、php、Python编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Mac OS,Linux 自带了shell解释器,Windows比较麻烦,因为Win7专业版和旗舰版默认安装PowerShell,标准版和家庭版中就没有安装的,为了方便建议安装cygwin
PHP、Python 也可以作为Shell编程
PHP、Python是属于高级编程语言,但是也可以做Shell编程,因为只要有解释器,也可以用作脚本编程
如下是一个Python Shell Script示例(假设文件名叫op_python_base.py):
#!/usr/bin/env python3 //告诉Python从系统环境中找python # -*- coding: utf-8 -*- //设置为UTF-8编码 for index in range(10): print(index); 复制代码
如下是一个PHP Shell Script示例(假设文件名叫op_php_base.php):
#!/usr/bin/php <?php for($i=0 ;$i<10; $i++){ echo $i; } ?> 复制代码
为什么要学习Shell
既然PHP、Python都可以用来写脚本编程,那为什么还要学习陌生、晦涩难懂的Shell,主要有一下几个原因
- 环境兼容性,Win7专业版和旗舰版默认安装PowerShell,标准版和家庭版中就没有安装的,其他主流的操作系统都预制了Shell解释器,所以使用sh、bash编写,提供给其他人使用是非常方便的,但是PHP、Python 等等需要安装相应的环境
- 如果你想做一些定时任务比如说检测进程是否存在,自动备份,或者说自动部署环境、服务器之间的数据同步等等sh、bash会是你最好的选择
sh与bash
sh: Bourne shell,POSIX(Portable Operating System Interface)标准的shell解释器,它的二进制文件路径通常是/bin/sh
bash: Bash是Bourne shell的替代品,属GNU Project,二进制文件路径通常是/bin/bash
第一个shell脚本
我们先来看一个例子
我相信写过代码的童鞋,应该对下面的代码很熟悉并不陌生,(假设文件名叫op_base.sh):
#!/usr/bin/env bash mkdir code cd code for ((i=0; i<3; i++)); do touch test_${i}.txt echo "shell很简单" >> test_${i}.txt done 复制代码
第一行:从系统path中寻找指定脚本的解释程序 第二行:创建 名叫code文件夹 第三行:进入创建的文件夹 第四行:for循环3次 第四行:创建文件 第五行:往创建的文件中写入信息 第六行:结束循环
mkdir, touch,cd,touch,echo都是系统命令,在命令行下可以直接执行 for, do, done 是shell脚本语言 for循环的语法
编写Shell
新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php,扩展名为php,如果你用Python,扩展名为python
第一行一般是这样:
#!/usr/bin/php #!/usr/bin/env python3 #!/usr/bin/env bash 复制代码
#!”是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行 /env 是系统的PATH目录中查找
运行 Shell 脚本有两种方法:
作为可执行程序
chmod +x op_base.sh ./op_base.sh 复制代码
第一行设置 op_base.sh可执行权限 第二行执行op_base.sh
作为参数
/bin/sh op_base.sh 复制代码
变量
定义变量时,变量名前不需要加符号和Python一样但是在PHP语言中变量需要加$,如:
my_name="jack" my_name='jack'; 复制代码
ps: 变量名和等号之间不能有空格,变量后面不能有;
Shell中的引号和PHP类似,字符串可以用单引号,也可以用双引号
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行
双引号:
- 双引号里可以有变量
- 双引号里可以出现转义字符
但是在Python中单引号和双引号是没有区别,但是Python 还有三个引号,在三个引号内字符都不会被转义
使用变量
对于已经定义过的变量,使用的适合在前面添加$
echo $my_name echo ${my_name} 复制代码
变量名外面的花括号是可选的,加不加都行,建议使用第二种形式
注释
以“#”开头的行就是注释,会被解释器忽略。
多行注释
sh里没有多行注释,只能每一行加一个#号。就像这样:
#-------------------------------------------- # Author: jack # weibo: OO是有情怀的PM # # Notes: 10分钟入门Shell脚本编程 # # Project home page: # https://github.com/dpm100/fast_guides #-------------------------------------------- 复制代码
字符串
字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似
Shell不像其他语言有php、python 有很多数据类型,在Shell中常用的数据类型字符串数字和字符串(ps: 除了数字和字符串,也没啥其它类型好用了,哈哈)
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行
双引号:
- 双引号里可以有变量
- 双引号里可以出现转义字符
字符串操作
拼接字符串
my_name="jack"; my_age="20岁" echo $my_name $my_age echo $my_name$my_age 复制代码
获取字符串长度
echo ${#my_name} 复制代码
截取字符串
echo ${my_name:0:2} 复制代码
Shell 数组
定义数组
在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
name=(name1 name2 name3) 复制代码
还可以单独定义数组的各个分量:
ary[0]=name1 ary[1]=name2 ary[3]=name3 复制代码
ps: 可以不使用连续的下标,而且下标的范围没有限制
读取数组
读取数组元素值的一般格式是:
${数组名[下标]} 复制代码
例如:
echo ${name[0]} 复制代码
使用@符号可以获取数组中的所有元素,例如:
echo ${name[@]} 复制代码
获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同,例如:
# 取得数组元素的个数 length=${#name[@]} echo $length # 或者 length=${#name[*]} echo $length # 取得数组单个元素的长度 lengthn=${#name[n]} echo $length 复制代码
Shell 流程控制
和Java、PHP、Python等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法):
<?php if (isset($_GET["q"])) { search(q); } else { // 不做任何事情 } 复制代码
在sh/bash里可不能这么写,如果else分支没有语句执行,就不要写这个else
if
if condition1 then command1 elif condition2 then command2 else commandN fi 复制代码
例子:
#!/usr/bin/env bash a=1 b=2 if [ $a == $b ] then echo "a 等于 b" elif [ $a -gt $b ] then echo "a 大于 b" elif [ $a -lt $b ] then echo "a 小于 b" else echo "没有符合的条件" fi 复制代码
for 循环
Shell的for循环和Python 有点类似
Python的for循环
for index in 1,2,3,4,5: print(index); 复制代码
Shell的for循环,第一种写法
for index in 1 2 3 4 5; do echo "index="$index done 复制代码
Shell的for循环,第二种写法
for ((i=0; i<5; i++)); do echo "i="$i done 复制代码
while 语句
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。
int=1 while(( $int<=5 )) do echo $int let "int++" done 复制代码
Shell结合系统命令
sh脚本结合系统命令便有了强大的威力,在字符处理领域,有grep、awk、sed三剑客,grep负责找出特定的行,awk能将行拆分成多个字段,sed则可以实现更新插入删除等写操作。
例如定时检测nginx、mysql是否被关闭
path=/var/log log=${path}/httpd-mysql.log name=(apache mysql) exs_init[0]="service httpd start" exs_init[1]="/etc/init.d/mysqld restart" for ((i=0; i<2; i++)); do echo "检查${name[i]}进程是否存在" ps -ef|grep ${name[i]} |grep -v grep if [ $? -eq 0 ]; then pid=$(pgrep -f ${name[i]}) echo "`date +"%Y-%m-%d %H:%M:%S"` ${name[$i]} is running with pid $pid" >> ${log} else $(${exs_init[i]}) echo "`date +"%Y-%m-%d %H:%M:%S"` ${name[$i]} start success" >> ${log} fi done 复制代码
解释:检测 nginx、mysql进程是否存在,如果不存在了会自动重新启动。 脚本每次运行会写日志的,没事可以去看看该日志文件,如果进程是不是真的经常性不存在,恐怕就要排查一下深层原因了。
编辑 /etc/crontab 文件
crontab -e 复制代码
在文件最后添加一行:
*/5 * * * * /xxx/check_nginx.sh > /dev/null 2>&1 复制代码
上表示每 5 分钟,执行一下脚本 /xxx/check_nginx.sh,其中xxx代表路径
/dev/null 2>&1 的意思是该条shell命令将不会输出任何信息到控制台,也不会有任何信息输出到文件中。
# For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * command to be executed 复制代码
添加完配置,需要重启才能生效
service crond restart
原文链接:https://juejin.im/post/5a6378055188253dc332130a
相关推荐
- 小白初学linux之无法修改系统分辨率
-
/*此文是做为自己的一个总结还有就是最好也可以给大家提供一些帮助。*/时间:2020年7月14日11:28:41我安装的是Ubuntu20.04LTS,昨天处理的是,grub的引导问题,因为是...
- Ubuntu 如何启动、停止或重启服务
-
在本文中,我们向您介绍在Ubuntu中启动、停止和重启服务的方法。列出Ubuntu中的所有服务在开始之前,先获取计算机上所有服务的列表,因为我们需要知道服务名称来管理服务。service--...
- Win11学院:如何在Windows 11上使用WSL安装Ubuntu
-
IT之家2月18日消息,科技媒体pureinfotech昨日(2月17日)发布博文,介绍了3中简便的方法,让你轻松在Windows11系统中,使用WindowsSubs...
- Linux安装中文输入法-Google拼音输入法,搜狗输入法
-
主要步骤,选择适合自己的尝试:1)卸载之前没装好的搜狗输入法。@:~/Downloads$sudoapt-getremovefcitx*删除依赖库@:~/Downloads$sudoap...
- Ubuntu 22.04 请谨慎使用搜狗输入法,可能是你当机原因
-
在Ubunutu下没有什么有名的输入法,也就听说搜狗输入法有Linux版本,所以特意到官网去找了下载。在Ubuntu新版本里,他仍然用的是fcitx框架的输入引擎,而不是默认的ibus,所以要先把i...
- 前钢后胶!徐工XMR403VT小型压路机有点意思
-
【第一工程机械网原创】在越来越注重施工品质,对项目管理越来越精细化的今天,施工方在施工设备选择上,也越来越讲究设备的配套分工,因此小型压路机的应用场景也越来越多。徐工XMR403VT小型压路机高度集...
- 图大明白 | 404错误为什么是Not Found?为什么是404?
-
“404错误”大家都不陌生吧?常规来讲它长这样或者长这样艺术一点的长这样404NotFound意思就是所请求的页面不存在或者已被删除被称为“互联网最后一个界面”有很多同学发出疑问:为什么是404?...
- Nginx负载均衡安全配置说明2(nginx负载均衡部署)
-
上一节,我们对Nginx安全配置的几个知识点做了一个说明,例如限制IP访问、文件目录禁止访问限制、需要防止DOS攻击、请求方法的限制和限制文件上传的大小这个进行了一个分析说明,详细的文章请关注我的头条...
- 惊艳写真系列第403期,本期主人公—叶青
-
惊艳写真系列第403期,本期主人公—叶青制作不易,欢迎各位看官提供宝贵意见。如果您喜欢记得关注,么么哒。您的每一份点赞和关注都是对作者的最大认可(图片素材均来源于网络,如有侵权联系删除。)本篇是写惊艳...
- 先秦布币之尖足布、圆足布、方足布,今年圆足最高拍卖价16万一枚
-
在战国魏、韩地区诞生桥足平首布、锐角平首布之后,赵也诞生了尖足平首布,并且在尖足布的基础上,后来相继派生出了圆足布、三孔布,以及类圆足布和类方足布。一尖足布尖足布是从耸肩尖足空首布演变而来的,是黄河...
- 403 禁止访问错误的全面排查与解决方案
-
当遇到403Forbidden错误时,意味着服务器已接收并理解请求,但拒绝执行访问操作。以下从用户端、服务器端等多个维度,提供分步排查与解决方法。一、用户端基础排查1.检查URL准确性确认...
- 这才是2019年夏最高颜值的泳装(2019夏季泳装秀)
-
最近的天气是越来越热了,又到了暑期泳衣勇闯海滩的时刻了,打开ins,微博满满地都是各大博主晒的泳装照,明星们也纷纷跑到海边去度假了。虽然我们没有超模般地身材,但是到了海边我们也要成为人群中最亮眼的那颗...
- 朋友圈爆火!这组《衡中班主任的一天》漫画,感动了无数人!
-
很多人觉得做老师很轻松他们说有些老师一天一节课就下班了有双休,还有寒暑假,真让人羡慕呀······但事实真是这样吗?最近衡水中学的赵心扬同学画了一组漫画形象地还原了衡中班主任一天的生活那么衡中班主任一...
- 国家安全教育 | 一组漫画,带你走进国家安全!
-
当前,我国面临哪些安全威胁?下面带你来看一组漫画!①你要配合,注意保密。我绝不对别人讲。②这件事,千万别对别人讲。③咱单位的…喂!老k!你要当心,有风声了!④你的泄密行为已触犯了国家法律!①请你协助了...
- 400、403、404、405,访问网页时出现这些代码是什么意思?
-
今天小泽访问一个页面时,出现了403,很抱歉,您的访问请求被禁止的提示。相信经常用电脑访问网页的朋友都遇到过这种情况,有的网页提示错误代码403,有的提示404,那这些代码都代表了什么呢?有什么含义呢...
你 发表评论:
欢迎- 一周热门
-
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WindowsServer2022|配置NTP服务器的命令
-
WIN11 安装配置 linux 子系统 Ubuntu 图形界面 桌面系统
-
解决Linux终端中“-bash: nano: command not found”问题
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
NBA 2K25虚拟内存不足/爆内存/内存占用100% 一文速解
-
Linux 中的文件描述符是什么?(linux 打开文件表 文件描述符)
-
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)