Shell脚本编程实战
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本编程实战相关的知识,希望对你有一定的参考价值。
参考技术A 做 Java 的肯定都接触过 Linux 系统,那么很多时候我们在开发的过程中都是把我们项目打成一个jar包,或者是war包的形式,然后通过 XFTP 上传到我们服务器的指定目录,然后运行一端启动脚本,让我们的项目变得可以访问 就像 ./sh service.sh start 然后启动我们写好的 sh 的shell脚本。接下来我们就来学习一下关于 Shell 脚本是如何写出来的。Shell 脚本是什么?Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等,也就是说,我们用户每输入一条命令,Shell 就会相对应的执行一条命令。当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序文件就被称为Shell脚本。
在我们的 Shell 脚本中,会有各种各样的内容,赋值,计算,循环等一系列的操作,接下来我们就来看看这个 Shell 脚本怎么写吧
1.查看自己当前系统默认的 Shell
echo $SHELL
输出:/bin/bash
2.查看系统支持的Shell
cat /etc/shells
输出:
/bin/sh /bin/bash /usr/bin/sh /usr/bin/bash
也就是说,我们的云服务器是支持我们在这里给他安排 Shell 脚本的
我们这时候先来安排一下 sh 的文件,创建一个文件夹,然后在其中创建一个 sh 的文件。
mkdir /usr/local/shelltest
touch test.sh
创建完成我们编辑一下内容
vim test.sh
然后我们出来运行一下我们的 Shell 的第一个脚本
bash test.sh
出来的结果是 Hello World Shell
一个及其简单的脚本出现了,接下我们就分析一波我们写了点啥?
#!/bin/bash
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell
我们在之前也使用了 echo $SHELL 来查看了自己系统默认的是哪一种 sh 解析器,之前看到的是/bin/bash,所以我们在写 Shell 脚本的时候,我们在开头默认的约定中,我们写了这个是用 /bin/bash 来进行解释的,
那么我们如何像之前调用我们的当前目录中的 Shell 脚本一样去调用他呢?就像这个样子的 ./sh service.sh start
1.授权,
我们先不授权试一下看看能通过 ./test.sh 进行调用么
bash: ./test.sh: Permission denied 会提示这个,也就是没有授权定义,
授权命令:chmod +x test.sh
2.执行 ./test.sh
然后调用就能正常输出了,就是说,在当前的目录下执行这个脚本命令。
变量命名实际上很简单,我们先来试一下
name=zhiyikeji
这时候我们怎么使用变量呢?实际上只要在前面加上一个符号就可以 $
echo $name
上面的两种写法都是可以的,外面的大括号加和不加区别不大,可以省略,直接就 $name 就可以使用你定义的变量
使用括号的意义一般在于区别某些变量,比如你写了一串的内容,可能写的是 echo $nameismyfriend ,如果连在一起,是不是有点尴尬,这时候就可以使用括号区别一下, echo $nameismyfriend 不使用括号的时候,他就去找nameismyfriend这个变量了,就无法出来我们要的效果。
unset name
这时候我们就把我们刚才定义的 name=zhiyikeji 这个变量给去掉了,我们可以调用一下我们的变量看是什么?
echo $name
这是不是就证明我们自己定义的变量已经删除了
那么我们需要一个关键字,大家肯定能想到是什么关键字 readonly
我们先给name赋值,然后使用 readonly 设置只读,然后再改变一下试试,
竟然是真的,如果不设置只读,是不是会重新可以进行赋值,我们测试个年龄,
所以我们就可以肯定,readonly就是设置只读的关键词,记住了么?
那么设置只读的变量可以删除么?毕竟总有杠精的面试官会提问这个棘手的问题,但是,阿粉试过的所有方式好像都是不行的,阿粉就直接重启了自己的服务器,这样临时的变量就不存在了!
说真的,Shell脚本的流程控制数一般才是yyds,为什么这么说,因为你在写大部分的脚本的时候,流程控制的地方永远是最多的,判断,选择,等等一系列的函数,当时熟练使用的时候,就发现这东西确实很有意思。
我们先说最简单的 if else 这也是我们最经常使用的判断,在写 Shell 脚本的时候,就不像我们的 Java 中直接写
Xshell 中的语法就不是这个样子的, Xshell 语法:
末尾的 fi 就是 if 倒过来拼写,我们可以写一个 if 的脚本试一下这个流程能否理解。
这里申明一下,
我们在上面这段脚本中写就是内容就是,我们给脚本传入一个值,然后比对这个值和2的大小关系,然后输出我们指定的内容。
运行后就能看到
$1 表示我们给 Shell 脚本输入的第一个参数, $0 就是你写的shell脚本本身的名字,$2 是我们给 Shell 脚本传的第二个参数
大家在部署某些项目的时候,是不是启动命令就很简洁,就是 sh service.sh start 类似这种的,那我们来看看一般这种是怎么写的,这就用到了另外一块的内容,和 if 类似,在 Java 中也有,那就是 Case .
我们先来看看 Case 的语法,
case ... esac 实际上就和 Java 中的 Case 是非常相似的,case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令. esac 是一个结束的标志。
光说不练,假把式,我们来搞一下试试写一个脚本来搞一下。就用我们刚才说的 sh servic.sh start 来进行测试。
我们来看看运行结果
那么这段 Shell 脚本是什么意思呢?其实很简单,匹配我们传入的第一个字符,和 start 还有 stop 进行比较,如果匹配上之后,输出命令,最后退出即可。
是不是感觉没有那么复杂了呢?
说到流程控制,那么肯定不能不说 for , 毕竟 for 循环在 Java 中那可是重头戏。
我们先看他的格式
那么我们有没有说像是 Java 中那种 for 循环一样的方式呢?比如说这个 for ((i=1; i<=j; i++))
实际上也是支持这种的,我们来写一个试试。
执行一下看看
既然有 for 那是不是就有 while 呢?是的,没错,确实是有 while ,也是循环的意思,但是写法有略微不一样的地方
我们来举个尝试打印九九乘法表来看一下
是不是也挺简单的?
其实 Shell 脚本的编写一般都是在实际应用中提升,单纯的写测试脚本,也是可以让自己对知识的掌握比较充分,而我们一般都是写一些比较简单的脚本,复杂的不是还有运维么?
Shell编程实战
为什么要学习Shell编程
Shell脚本语言是实现Linux/Unix系统管理及自动化运维所必须的重要工具,Linux系统的底层以及基础应用软件的核心大都涉及Shell脚本的内容。
一个合格的Linux系统管理员都必须熟练编写Shell脚本语言,从而提升运维人员的工作效率,减少不必要的重复性工作。
学习Shell所需的基础知识
熟练使用VIm编辑器,熟悉SSH终端等配置
在Linux下开发shell脚本用的最多的就是vim编辑器,熟练使用vim可以使得shell脚本开发事半功倍!
有一定的Linux命令基础,熟练掌握80个命令以上
shell和其他脚本语言不同,如python,Shell缺少可以直接使用的外部函数库,因此Linux系统的命令就可以当做Shell的函数库!
熟悉常见Linux服务部署,优化,分析与排错
学习Shell直接的目的是在工作中对系统以及服务进行自动化管理,因此如果不熟悉服务操作,使用shell也就没有意义了
什么是Shell
Shell存在于操作系统的最外层,负责与用户直接对话,把用户的输入解释给操作系统,处理操作系统的输出结果,然后反馈给用户。
Shell是一个命令解释器,它的作用是解释并执行用户输入的命令和程序等,用户每输入一条命令,Shell解释器就执行一条,存在一种交互的方式。
从开机准备输入用户名和密码,到登录成功,所有的操作都是Shell解释并执行的。
什么是Shell脚本
当命令或者程序语句不是在命令行中执行,而是通过一个程序文件来执行时,这个程序就称作Shell脚本。
一个简单的Shell脚本
清除/var/log下的messages日志文件
把所有命令放入一个文件,堆积起来后就是一个脚本文件!注意文件的可执行权限,与用户身份
#清除脚本日志 cd /var/log cat /dev/null > messages echo "Logs cleaned up . done"
Shell脚本语言的种类
Shell脚本语言是弱类型语言(无须定义变量的类型即可使用)
在Linux中有两大Shell,一是Bourne shell,二是C shell
我们需要知道的就是标准的Bourne Again shell(bash)所取代
查看CentOS 7系统的Shell
其他的脚本语言
php
Perl
Python
语言选择
Shell脚本语言优势在于处理系统底层的业务,基于linux命令处理也是最快的,常用语开发自动化安装,监控报警,软件启动等脚本。
第一个Shell脚本与hello world
脚本开头
一个规范的脚本文件会在第一行指出由哪个程序来执行脚本的内容,必须位于第一行!!!如果你不加默认也会交给bash解释,良好的编程习惯,最好加上开头解释器语言标识
#!/bin/bash
#!/usr/bin/env python
执行Shell脚本的方式
bash 脚本名
sh 脚本名
此方法是脚本没有可执行权限时,或者文件头没指定解释器时用的方法
path/scriptName
./scriptName
此方法需要脚本有可执行权限,chmod +x scriptName
source scriptName
. scriptName
加载并执行脚本文件中的命令和语句
[root@oldboy_python /tmp 11:10:08]#sh test.sh chaoge nb [root@oldboy_python /tmp 11:10:18]#cat test.sh #!/bin/bash echo \'chaoge nb\' [root@oldboy_python /tmp 11:10:21]#. test.sh chaoge nb [root@oldboy_python /tmp 11:10:33]#source test.sh chaoge nb
#添加可执行权限给test.sh
chmod +x test.sh
./test.sh
变量
环境变量一般指的是export内置命令导出的变量,用于定义SHell的运行环境。
Shell通过环境变量来确定命令提示符,也就是超哥前面说的PS1变量
环境变量可以在命令行中设置和创建,但是用户退出命令行时变量值就会丢失,因此可以写入/etc/profile文件中,每次用户登录时,变量都会被初始化!
环境变量名字均大写,用env查看
设置登录的提示
[root@oldboy_python ~ 11:21:51]#cat /etc/motd \'welcome chaoge bakcome~~~~~~~~~\'
yudanL:~ yuchao$ ssh root@192.168.11.11
Last failed login: Wed Aug 29 11:20:20 CST 2018 from 111.231.199.24 on ssh:notty
There were 25 failed login attempts since the last successful login.
Last login: Wed Aug 29 10:45:51 2018 from 223.72.74.11
\'welcome chaoge bakcome~~~~~~~~~`\'
定义变量
变量定义的注意点
- 变量名和等号之间不能有空格
- 命名只能用英文字母,数字,下划线,首个字符不能用数字
- 不能用标点符号
- 不能用关键字
name=\'chaoge\'
echo $name
echo ${name} #帮助解释器识别变量的边界
#变量重新赋值
name=\'chaogenb\'
设置只读变量
[root@oldboy_python ~ 11:29:31]#readonly name [root@oldboy_python ~ 11:30:27]#name=\'chaogenb3\' -bash: name: 只读变量
删除变量
unset name
变量类型
- 局部变量 在脚本或命令中定义,仅在当前shell有效
- 环境变量 所有的程序,shell程序都能访问环境变量
- shell变量 特殊变量 既有环境变量 又有局部变量
字符串
字符串可以用单引号,也可以双引号,也可以没引号
[root@oldboy_python ~ 11:42:42]#addr=\'shahe\' [root@oldboy_python ~ 11:44:55]#echo $addr shahe
单引号的任何字符串都会原样输出,单引号字符串中的变量无效
单引号字符串不能出现单一的单引号,转义符也不可用,可用作字符串拼接
双引号
双引号里可以用变量
双引号可以有转义符
[root@oldboy_python ~ 11:45:01]#addr=\'changpingshahe\' [root@oldboy_python ~ 11:48:06]#name=\'yuchao\' [root@oldboy_python ~ 11:49:00]#message="Hello,${name},Your addr is \\"${addr}\\" " [root@oldboy_python ~ 11:50:05]#echo $message Hello,yuchao,Your addr is "changpingshahe"
获取字符串长度
[root@oldboy_python ~ 13:36:35]#str=\'abc\' [root@oldboy_python ~ 13:36:49]#echo ${#str} 3
切片操作
左闭又开规则
[root@oldboy_python ~ 13:39:45]#str=\'I am chaoge,hello world!\' #取出0和10索引的字符 [root@oldboy_python ~ 13:40:42]#echo ${str:0:11} I am chaoge
查找字符索引
[root@oldboy_python ~ 13:45:02]#str=\'I am chaoge,hello world!\' [root@oldboy_python ~ 13:46:20]#echo `expr index "$str" e` 11
以上是关于Shell脚本编程实战的主要内容,如果未能解决你的问题,请参考以下文章