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~~~~~~~~~'

定义变量

变量定义的注意点

  • 变量名和等号之间不能有空格
  • 命名只能用英文字母,数字,下划线,首个字符不能用数字
  • 不能用标点符号
  • 不能用关键字
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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏王亚昌的专栏

strace命令解析

strace常用于跟踪和分析进程执行时中系统调用和耗时以及占用cpu的比例,常用的格式如下:

16410
来自专栏Python入门

Python存取文件方法有很多,但是这四种真的算的上是骚操作了

在不需要借助任何外界库的前提下,python内置方法其实也可以完成我们需要的文件存取任务,这里主要介绍几种python内置方法的使用方式,最后再给出一个实际案例...

20760
来自专栏增长技术

git对象模型

所有用来表示项目历史信息的文件,是通过一个40个字符的(40-digit)“对象名”来索引的,对象名看起来像这样:

14830
来自专栏工科狗和生物喵

【计算机本科补全计划】指令:计算机的语言(MIPS) --计算机组成原理 Part2

正文之前 今天折腾了一天的ubuntu windows双系统,在windows下安装ubuntu 16.04 然后 安装引导启动器的时候选择的是/boot所在的...

32940
来自专栏自动化测试实战

RF接口测试(2)--http请求之get

55180
来自专栏云计算教程系列

如何在Ubuntu 16.04上设置Jupyter Notebook以运行IPython

IPython是Python的交互式命令行界面。Jupyter Notebook提供了多种语言的交互式Web界面,包括IPython。

82940
来自专栏顶级程序员

为什么文件名要小写?

来自:阮一峰的网络日志 链接:www.ruanyifeng.com/blog/2017/02/filename-should-be-lowercase.htm...

30850
来自专栏张善友的专栏

Debug和Release之本质区别

Debug 和 Release 编译方式的本质区别     Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release ...

22590
来自专栏个人随笔

房上的猫:JavaDoc注释

//这是一个注释 /*   *这是一个演示程序   */ /**    *@这是JavaDoc注释。   */ JavaDoc注释    背景:       j...

373100
来自专栏java一日一条

Java 编程要点之并发(Concurrency)详解

计算机用户想当然地认为他们的系统在一个时间可以做多件事。他们认为,他们可以工作在一个字处理器,而其他应用程序在下载文件,管理打印队列和音频流。即使是单一的应用程...

12120

扫码关注云+社区

领取腾讯云代金券