10分钟入门Shell脚本编程(shell脚本编程100例)
off999 2024-09-14 07:07 51 浏览 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
相关推荐
- office2007密钥 office2016(office2007ultimate密钥)
-
word2016激活密钥有两种类型:永久激活码和KMS期限激活密钥。其中,永久激活密钥可以使用批量授权版永久激活密钥进行激活,如所示;而KMS期限激活密钥需要使用KMS客户端密钥进行激活,如所示。另外...
- windows10系统启动盘制作(windows10启动盘制作教程)
-
Windows10系统更改启动磁盘的方法如下1、按快捷键Win+R,调出命令窗口2、输入msconfig,点【确定】3、在系统配置中,选择【引导】菜单4、选择要默认启动的磁盘,点【设置为默认值】,...
- 方正电脑怎么重装系统
-
购买一张系统盘,然后启动电脑,将购买的系统盘插入电脑光驱中,等待光驱读取系统盘后,点击安装系统,即可自动安装,等待安装完毕,电脑会自动重启,重新启动后,电脑的系统就安装完毕,可以使用了一、准备需要的软...
-
- qq邮箱怎么写才正确
-
步骤/方式1一般默认的QQ邮箱格式是:QQ号码@qq.com,即QQ账号+@qq.com后缀步骤/方式2若要发送邮件,也要在对方的qq帐号末尾加上@qq.com1.每个人在注册QQ时都会有关联的一个邮箱,它的格式就是“QQ号码@qq.com...
-
2025-12-21 18:51 off999
-
- 电脑怎么看配置信息
-
要查看Windows电脑的配置信息,可以通过按下Win键+R,然后在弹出的运行对话框中输入“dxdiag”并按回车键打开DirectX诊断工具,可以查看有关处理器、内存、显卡等硬件信息。另外,还可以右键点击“此电脑”,选择“属性”来查看...
-
2025-12-21 18:03 off999
- mpeg是什么格式(mpeg是什么格式和mp4的区别)
-
是视频格式,是电脑视频文件的一种,相对其它视频文件格式而言,mpeg格式占的存储空间相对比较小,那么像素也就相对比较低,图像也没有其它格式那么高清,不过一般情况下已经满足正常的使用。好多视频文件都是采...
- 电脑参数配置怎么选(电脑参数配置怎么选择)
-
1、CPU,这个主要取决于频率和二级缓存,三级缓存,核心数量。频率越高、二级缓存越大,三级缓存越大,核心越多,运行速度越快。速度越快的CPU只有三级缓存影响响应速度。2、内存,内存的存取速度取决于接口...
- windows7字体(Windows7字体库在哪)
-
win7系统默认中文字体是微软雅黑字体1、首先我们先打开个性化2、然后我们打开“窗口颜色”3、然后我们点击“项目”里的桌面,选择“已选定的项目”4、下面就可以改字体,还有字体的颜色、大小5、然后点击“...
- windows7x86是32位吗(windows7 x86)
-
X86不是代表操作系统,是代表的CPU的类型,如果你知道CPU的发展史就知道,个人用计算机的CPU很早的版本是从286、386、486、586、奔腾等等类型发展起来的,所以X86的代表PC的CPU的类...
- 固态硬盘删除后又自动恢复了
-
进入BIOS查看,第一启动项是不是UEFI引导,改掉它可以下载个pe,下载安装在本地磁盘里,重启进入pe工具,先给固态格式化分区,在ghost机械盘上的系统,还原到固态上。遇到这种情况一定不要在此...
- win10版本回退(win10回退到以前版本)
-
如果你想在Windows10系统中回退到上一个版本,可以按照以下步骤进行操作:1.打开设置:点击Windows开始按钮,然后点击屏幕左侧的“设置”图标,或者使用键盘快捷键Win+I打开设置。2...
- 营业厅一个路由器多少钱(上门更换路由器收费吗)
-
移动免费装宽带活动全国都在搞,不过免费是有“门槛”的。以我所在的地区为例,只有月费在78元及以上的大流量套餐用户,才可以享受免费安装移动的宽带。月费越高,宽带的速率也越高,148元档可以安装200M的...
- win10从u盘启动怎么设置(win10怎么从u盘启动电脑)
-
1.回到桌面。点击开始徽标,点击开始菜单左侧的设置。2.设置界面点击更新和安全。3.进入更新和安全界面,点击左侧的恢复选项。4.进入恢复界面,点击高级启动下面的立即重新启动。5.插入自己的U盘,等待...
- 系统大全网站(系统大全网站推荐)
-
下载时发生错误可能是以下原因:1.你的网速过慢,网页代码没有完全下载就运行了,导致不完整,当然就错误了。请刷新。2.网页设计错误,导致部分代码不能执行。请下载最新的遨游浏览器。3.你的浏览器不兼容导致...
- win10官方启动盘(win10官方启动盘怎么用)
-
1、在开始菜单搜索“设置”,打开“设置”;2、点击“更新与安全”,在左侧菜单栏点击“恢复”;3、点击“启动项”,在弹出的窗口中会显示当前可以启动的项目,点击“编辑”;4、在打开的“编辑启动项”窗口中,...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
