第一章 如何才能学号Shell编程
学好Shell编程所需的基础知识:
(1) 熟练使用vim编辑器。
(2) 要有一定的Linux命令基础,120个常用命令以上。
(3) 熟练掌握Linux正则表达式以及三剑客命令。
如何能学号Shell编程之“老鸟”经验谈:
(1) 掌握Shell脚本基本语法的方法
(2) 掌握Shell脚本的各种常见语法。
(3) 形成自己的脚本开发风格。
(4) 从简单做起,简单判断,简单循环。
(5) 多模仿,多放下参考资料练习,多思考。
(6) 学会分析问题,逐渐形成编程思维。
(7) 编程变量名字要规范,采用驼峰语法表示。
(8) 不要拿来主义,特别是新手。
第二章 Shell脚本初步入门
1、 什么是Shell?
Shell是一个命令解释器,作用是解释执行用户输入的命令以及程序,用户每输入一条Shell就解释执行一条。
2、 什么是Shell脚本?
当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序就被称为Shell脚本。用户可以在Shell脚本中敲入一系列的命令及命令语句组合。这些命令、变量和流程控制语句等有机地结合起来,就形成了一个功能强大的Shell脚本。
P8案例2-3
第一关,必须是root才能执行脚本,否则给出友好提示并终止脚本运行。
第二关,成功切换目录,否则给出友好提示并终止脚本运行。
第三关,清理日志,如清理成功,则给出正确提示。
第四关,通关或失败,分别给出相应的提示。
2.1 Shell脚本在Linux运维工作中的地位:
Shell脚本语言很适合用于处理纯文本类型的数据。
2.2 脚本语言的种类:
Shell脚本语言是弱类型语言(无需定义变量的类型即可使用)。
(1) Bounrne shell
Bourne shell又包括Bourne shell(sh)、Korn shell(ksh)、Bounrne Again Shell (bash)。
(2) C shell
C shell又包括csh、tcsh两种类型。
Linux系统中的主流Shell是bash。
2.3 其他常用的脚本语言种类:
(1)PHP语言。
(2)Perl语言
(3)Python语言
2.4 Shell脚本语言优势:
Shell脚本语言的优势在于处理偏操作系统底层的业务。使用Shell开发会更简单、更快捷。例如:让软件一键自动化安装、优化,监控报警脚本,软件启动脚本,日志分析脚本等。使用Shell更符合Linux运维简单、易用、高效的三大基本原则。
PHP语言的优势在于小型网站系统的开发,只能应用于网页。
Python语言的优势在于开发较复杂的运维工具软件。
Java适用于中大型网站开发。
书写规范:
1、脚本里加#!/bin/bash
2、bash a.sh
3、. /a.sh 默认也是bash。Linux默认就是bash。
bash和sh的区别:
CentOS7:sh是bash的软链接。
bash –version #查看bash版本。
Shell脚本的基本执行流程:
执行脚本的5种方法
方式1:不需要执行权限
[root@web01 ~]# sh oldboy.sh #推荐
I am oldboy
[root@web01 ~]# bash oldboy.sh
I am oldboy
方法2:
[root@web01 ~]# cat oldboy.sh|bash
I am oldboy
方法3:输入重定向
[root@web01 ~]# sh <oldboy.sh
I am oldboy
方法4:执行权限
[root@web01 ~]# /root/oldboy.sh
-bash: /root/oldboy.sh: 权限不够
[root@web01 ~]#
[root@web01 ~]#
[root@web01 ~]# chmod +x /root/oldboy.sh
[root@web01 ~]# /root/oldboy.sh
I am oldboy
方法5:
[root@web01 ~]# . /root/oldboy.sh
I am oldboy
[root@web01 ~]# source /root/oldboy.sh
I am oldboy
结论:通过source或”.”加载执行过的脚本,由于是在当前Shell中执行脚本,因此在脚本结束之后,脚本中的变量(包括函数)值在当前Shell中依然存在,而sh和bash执行脚本都会启动新的子Shell执行,执行完后退回到Shell。因此,变量(包括函数)值无法保留。在进行Shell脚本开发时,如果脚本中有引用或执行其他脚本的内容或配置文件的需求时,最好用”.” 或source先加载该脚本或配置文件,处理完之后,再将他们加载到脚本的下面,就可以调用source加载的脚本及配置文件中的变量及函数等内容了。
P18范例2-5
结论:
(1)儿子Shell脚本会直接继承父亲Shell脚本的变量、函数(就好像是儿子随父亲姓,基因也会继承父亲的)等,反之则不可以。
(2)如果希望反过来继承(就好像是让父亲随儿子姓,让父亲的基因也继承儿子的,)就要用source或”.”在父亲Shell脚本中事先加载儿子的Shell脚本。
Shell脚本开发的基本规范及习惯
(1) Shell脚本的第一行是指定脚本解释器。
(2) Shell脚本的开头会加版本、版权等信息。
(3) 在Shell脚本中尽量不用中文(不限于注释)。
(4) Shell脚本的命名应以.sh为扩展名。
(5) Shell脚本应存放在固定的路径下.
第三章 Shell变量的核心基础知识与实践
什么是Shell变量?
变量就是用一个固定的字符串(也可能是字符、数字等的组合)代替更多、更复杂的内容,该内容里可能还会包含变量、路径、字符串等其他的内容。
变量类型:
(1) 环境变量(全局变量):可以创建它们的Shell及其派生出来的任意子进程Shell中使用,环境变量又可分为自定义环境变量和bash内置的环境变量。
(2) 普通变量(局部变量):只能在创建它们的Shell函数或Shell脚本中使用。普通变量一般由开发者在开发脚本程序时创建。
环境变量:
环境变量一般是指export内置命令导出的变量,用于定义Shell的运行环境,保证Shell命令的正确执行。Shell通过环境变量来确定登录用户名、命令路径、终端类型、登录目录等。
因为系统需要,自身存在的变量。
按照规范,所有环境变量名字均采用大写形式。
自定义环境变量
定义方法1:
[root@web01 ~]# export OLDBOY=1
[root@web01 ~]# echo $OLDBOY
1
定义方法2:
[root@web01 ~]# OLDGIRL=2
[root@web01 ~]# export OLDGIRL
[root@web01 ~]# echo $OLDGIRL
2
定义方法3:
-x to make NAMEs export
[root@web01 ~]# declare -x OLD=3
[root@web01 ~]# echo $OLD
3
环境变量永久生效
(1)/etc/profile
(2)~/.bash_profile
(3)~/.bashrc
(4)/etc/bashrc
# 优先顺序(4)到(1)
环境变量的知识小结:
(1) 变量名通常要大写。
(2) 变量可以在自身的Shell及子Shell中使用。
(3) 常用的export来定义环境变量。
(4) 执行env默认可以显示所有的环境变量名称及对应的值。
(5) 输出环境变量时用“$变量名”,取消环境变量时用“unset变量名”。
(6) 书写crond定时任务时要注意,脚本要用到的环境变量最好现在所执行的Shell脚本中重新定义。
(7) 如果希望环境变量永久生效,则可以将其放在用户环境变量文件或全局环境变量文件里。
环境变量初始化与对应文件的生效顺序:
系统运行Shell的方式一般有3种:
(1) 通过系统用户登录后默认运行的Shell。
(2) 非登录交互式运行Shell。
(3) 执行脚本运行非交互式Shell。
如果用户的Shell不是登录时启动的,就需要将变量设定等写入$HOME/.bashrc或者/etc/bashrc。
普通变量赋值一般有三种写法:不加引号,加单引号,加双引号。
在Shell中定义变量名以及为变量内容赋值的要求:
变量名一般是由字母、数字、下划线组成的,可以以字母或下划线开头,但不能是数字开头。
局部(普通)变量定义及赋值的经验小结:
(1) 若变量内容为连续的数字或字符串,赋值时,变量内容两边可以不加引号。
(2) 变量的内容很多时,如果有空格且希望解析内容中的变量,就加双引号。
(3) 希望原样输出变量中的内容时就用单引号引起内容进行赋值。
(4) 要使用反引号将赋值的命令括起来。
老男孩建议:
(1) 在脚本中定义普通字符串变量时,应尽量把变量的内容用双引号括起来。
(2) 单纯数字的变量内容可以不加引号。
(3) 希望变量的内容原样输出时需要加单引号。
(4) 希望变量值引用命令并获取命令的结果时就用反引号或$()。
一、变量名及变量内容定义小结
(1) 变量名只能为字母、数字或下划线,只能以字母或下划线开头。
(2) 变量名的定义要有一定的规范,并且要见名知意。
(3) 一般的变量定义、赋值常用双引号,简单连续的字符串可以不加引号,希望原样输出时使用单引号。
(4) 希望变量的内容时命令的解析结果时,要用反引号``,或者用$()把命令括起来再赋值。
二、Shell定义变量时使用“=”的知识。
三、打印输出及使用变量的知识
(1) 打印输出或使用变量时,变量名前要接,这个有些例外。
(2) 打印输出或使用变量时,一般加双引号或不加引号,如果是字符串变量,最好加双引号,希望原样输出时使用单引号。
[root@webol ~]# oldboy="I am oldboy"
[root@webol ~]# echo $oldboy
I am oldboy
1、 变量名
变量名组成、定义规范
2####、 等号
赋值符,两边不能有空格
3、 变量内容
单引号、双引号、反引号、不加引号
4、 输出变量内容
变量名加$符号,如果变量后面有内容,用{}引用变量部分。
单引号、双引号、反引号、不加引号
用echo或者printf