10分钟入门Shell脚本编程(shell脚本编程工具)
nanshan 2024-10-29 14:48 12 浏览 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 快速搭建企业级 DNS 服务器(Bind9 ...
-
一、引言在大型企业网络或自建系统中,搭建一套高可用、自控的DNS解析服务器至关重要。本文将带你基于Linux环境,从零搭建企业级DNS服务平台,采用Bind9实战配置,确保解析稳定、安...
- Linux无法解析域名的解决办法(linux无法解析域名的解决办法有哪些)
-
如果由于误操作,删除了系统原有的dhcp相关设置就无法正常解析域名。 此时,需要手动修改配置文件: /etc/resolv.conf 将域名解析服务器手动添加到配置文件中 该文件是DNS域名解...
- 在centos7 创建基于域名的虚拟主机nginx服务器
-
直接用ip地址访问首先是不安全,其次不太容易记住,如果你的服务器上的项目有很多个,你创建多个基于Ip的虚拟主机,很容易导致公网ip冲突或乱用的情况。这时候我们就可以选择基于域名的虚拟主机。第一步、安装...
- Linux之DNS服务(linux dnsserver)
-
一、学习路线如下二、DNS介绍1.域名的概念域名由特定的格式组成,用来表示互联网中某一台计算机或者计算机组的名称,能够使人更方便的访问互联网,而不用记住能够被机器直接读取的IP地址。2.DNS(dom...
- Linux环境下DNS服务器配置图文详细教程
-
测试环境为vmware虚拟机下,linux系统为RedHatEnterpriseLinuxServer6.0(Santiago),内核版本Linux2.6.32-71.el6.i686...
- 构建基于 Linux 的高性能 DNS 服务器
-
在现代网络架构中,DNS(域名解析)是访问互联网的关键环节。搭建一个高性能、低延迟、可缓存加速的私有DNS服务器,不仅可以提升访问速度,还能增强网络隐私和安全性。本文将基于Linux系统,详细...
- 从运维的角度带你初识neo4j图形数据库的安装及配置
-
前言随着公司业务架构的改变,以前我部署环境的时候,一般只是部署Mysql,jdk,tomcat即可,现在还要部署一些nosql,如redis,neo4j,在之前从来没了解过,随着学习的深入而做了一些笔...
- [超全整理] Java 程序员必备的 100 条 Linux 命令大全
-
一、基础操作(10条)#1.ls-查看目录内容ls-l#长格式显示文件和目录ls-a#显示隐藏文件ls-lh#带单位显示文件大小#2.cd-切换目录...
- 软件测试|一文教你轻松搭建docker环境
-
前言Docker提供轻量的虚拟化,你能够从Docker获得一个额外抽象层,你能够在单台机器上运行多个Docker微容器,而每个微容器里都有一个微服务或独立应用,例如你可以将Tomcat运行在一个Do...
- docker基础知识/尚硅谷docker学习笔记
-
最近看了好多docker的资料,找了一些尚硅谷docker的教学视频,大概总结了一下前前后后的学习笔记。分享给大家。安装Docker的基本组成镜像Docker镜像(Image)就是一个只读的模板。镜...
- 前端_react项目从windows部署到centos
-
前言:从工程角度来讲,本地开发完就要把项目部署到生产环境,此过程的快慢也直接影响着整体的效率。所以也有很多人做持续集成的工作,例如:CI/CD/一键部署。但对于个人开发者而言,如果能有工具支撑是最好的...
- Springboot项目使用docker部署(docker中运行springboot项目)
-
环境:SpringBoot2.2.10.RELEASE+Docker+Centos7+JDK8安装配置Dockeryum包更新到最新yumupdate卸载旧版本dockeryumre...
- Spring Boot 3.x + Redis 7.x,轻松掌握Redisson分布式锁实战技巧
-
大家好,我是袁庭新。在分布式环境中,确保数据的一致性和正确性是至关重要的。对于需要高性能、高并发和分布式数据存储的应用程序来说,Redisson是一个很好的选择。同时,Redisson提供的分布式锁功...
- Docker篇(二):Docker实战,命令解析
-
大家好,我是杰哥上周我们通过几个问题,让大家对于Docker有了一个全局的认识。然而,说跟练往往是两个概念。从学习的角度来说,理论知识的学习,往往只是第一步,只有经过实战,才能真正掌握一门技术所以,本...
- 新手快速入门Docker,轻松掌握Docker安装与使用
-
安装使用官方安装脚本自动安装curl-fsSLhttps://get.docker.com|bash-sdocker--mirrorAliyun手动安装CentOS7(使用yum进...
你 发表评论:
欢迎- 一周热门
-
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
手机如何设置与显示准确时间的详细指南
-
NAS:DS video/DS file/DS photo等群晖移动端APP远程访问的教程
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
如何修复用户配置文件服务在 WINDOWS 上登录失败的问题
-
一加手机与电脑互传文件的便捷方法FileDash
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
- 最近发表
- 标签列表
-
- 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)