鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

时间:2021-02-14 00:50:28


文章目录

  • ​​一、什么是shell scripts?​​
  • ​​1.shell的功能​​
  • ​​2.shell的作用​​
  • ​​二、第一个shell的撰写​​
  • ​​(1)在 shell script 的撰写中还需要用到底下的注意事项​​
  • ​​(2)shell执行的两种方式​​
  • ​​(3)最简单的shell的编写与执行​​
  • ​​(4)编写shell的良好习惯​​
  • ​​三、简单的shell练习​​
  • ​​(1)对谈式脚本:变量内容由用户决定​​
  • ​​(2)随日期变化:利用 date 进行文件的建立​​
  • ​​(3)数值运算:简单的加减乘除​​
  • ​​(a)变量计算的标准式子:var=$((计算式)) 来进行数值计算​​
  • ​​(4)数值运算:透过 bc 计算 pi​​
  • ​​四、shell执行方式的差异​​
  • ​​(1)利用直接执行的方式来执行sh shell脚本​​
  • ​​(2)利用 source 来执行脚本:在父程序中执行​​
  • ​​四、善用判断式​​
  • ​​(1)利用 test 指令检测某些文件或相关的属性​​
  • ​​(2)test的所有参数​​
  • ​​两个数之间的比较,判断字符串​​
  • ​​五、利用判断符号:中括号[]​​
  • ​​1.中括号的使用要求​​
  • ​​2.中括号常用在if...then...fi​​
  • ​​连接多个判断用-o​​
  • ​​六、shell的默认参数($0,$1...)​​
  • ​​1.不用read输入参数,而用shell的默认参数代替​​
  • ​​2.shell默认参数的偏移:shift​​
  • ​​七、条件判断式子:if .....then​​
  • ​​简单的条件判断用&& 和||,其它的用if....then​​
  • ​​(1)单层、简单条件判断式​​
  • ​​2.多重、复杂条件判断式​​
  • ​​3.查询到目前主机有开启的网络服务端口:netstat​​
  • ​​(1) 目前主机有启动的服务:netstat -tuln​​
  • ​​(2)如何透过 netstat 去侦测我的主机是否有开启这四个主要的网络服务端口口呢?​​
  • ​​(3)写个脚本程序来跑,让用户输入他的退伍日期,让你去帮他计算还有几天才退伍?​​
  • ​​八、利用 case ..... esac 判断​​
  • ​​(3)/etc/init.d/netconsole restart与/etc/init.d/netconsole​​
  • ​​九、function​​
  • ​​1.function的含义​​
  • ​​2.eg​​
  • ​​3.function的内建变量​​
  • ​​十、循环 (loop)​​
  • ​​1.while do done, until do done (不定循环)​​
  • ​​2.for...do...done (固定循环)​​
  • ​​3.for...do...done 的数值处理​​
  • ​​4.搭配随机数与数组的实验​​

一、什么是shell scripts?

1.shell的功能

(1)Shell script 拥有更强大的功能,那就是他可以进行类似程序 (program) 的撰写,并且不需要经过编译 (compile) 就能够执行;

(2)shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的;

(3)shell script 用的是外部的指令与 bash shell 的一些默认工具;

(4)shell script 用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上, 就不够好了, 因为 Shell scripts 的速度较慢,且使用的 CPU 资源较多,造成主机资源的分配不良。

2.shell的作用

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

二、第一个shell的撰写

(1)在 shell script 的撰写中还需要用到底下的注意事项

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

(2)shell执行的两种方式

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

(3)最简单的shell的编写与执行

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


解释:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

(4)编写shell的良好习惯

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

  • 在包覆的内部程序代码最好能以 [tab] 按键的空格向后推
  • 使用撰写 script 的工具最好使用 vim 而不是 vi ,因为 vim 会有额外的语法检验机制

三、简单的shell练习

(1)对谈式脚本:变量内容由用户决定

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

(2)随日期变化:利用 date 进行文件的建立

假设我想要建立三个空的文件 (透过 touch) ,档名最开头由使用者输入决定,假设使用者输入 filename 好了,那今天的日期是 2015/07/16 , 我想要以前天、昨天、今天的日期来建立这些文件,亦即 filename_20150714, filename_20150715, filename_20150716 ,该如何是好?

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

(3)数值运算:简单的加减乘除

(a)变量计算的标准式子:var=$((计算式)) 来进行数值计算

(b)bash shell里头预设仅支持到整数的数据而已

(c)eg1:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


eg2:至于数值运算上的处理,则有:『+, -, , /, % 』等等。 那个 % 是取余数啦~举例来说, 13 对 3 取余数,结果是 13=43+1,所以余数是 1 啊!就是:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


另外,如果你想要计算含有小数点的数据时,其实可以透过 bc 这个指令的协助喔!

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

(4)数值运算:透过 bc 计算 pi

  • 其实计算 pi 时,小数点以下位数可以无限制的延伸下去!而 bc 有提供一个运算 pi 的函式,只是想要使用该函式必须要使用 bc -l 来呼叫才行。
  • 下面那个 4*a(1) 是 bc 主动提供的一个计算 pi 的函数,至于 scale 就是要 bc 计算几个
    小数点下位数的意思。

四、shell执行方式的差异

(1)利用直接执行的方式来执行sh shell脚本

  • 当子程序完成后,在子程序内的各项变量或动作将会结束而不会传回到父程序中

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

(2)利用 source 来执行脚本:在父程序中执行

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

四、善用判断式

(1)利用 test 指令检测某些文件或相关的属性

  • 注意利用 test 与 && 还有 || 等标志

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

(2)test的所有参数

两个数之间的比较,判断字符串

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


(3)eg

要求如下:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


如果你执行这个脚本后,他会依据你输入的档名来进行检查喔!先看是否存在,再看为文件或目录类型,最后判断权限。 但是你必须要注意的是, 由于 root 在很多权限的限制上面都是无效的,所以使用 root 执行这个脚本时, 常常会发现与 ls -l 观察到的结果并不相同!

所以,建议使用一般使用者来执行这个脚本试看看

五、利用判断符号:中括号[]

1.中括号的使用要求

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


eg1:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

eg2:错误的用法如下:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

2.中括号常用在if…then…fi

eg如下:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

连接多个判断用-o

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

六、shell的默认参数($0,$1…)

1.不用read输入参数,而用shell的默认参数代替

(1)类似于下面(便于理解使用的rg)

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

(2)如果透过指令后面接参数, 那么一个指令就能够处理完毕而不需要手动再次输入一些变量行为!

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


(3)具体eg如下

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

2.shell默认参数的偏移:shift

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


解释:

  • 第一次进行 shift 后他的显示情况是『 one two three four five six』,所以就剩下五个啦!
  • 第二次直接拿掉三个,就变成『 two three four five six 』啦!
七、条件判断式子:if …then

简单的条件判断用&& 和||,其它的用if…then

(1)单层、简单条件判断式

(1)形式如下:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


要求如下:

  • 与将多个条件写入一个中括号内的情况不同, 多个中括号来隔开喔!而括号与括号之间,则以 && 或 || 来隔开,他们的意义是:
  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

  • eg:在使用中括号的判断式中, && 及 || 就与指令下达的状态不同了
  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


  • 为啥这样写?大多人则是喜欢一个中括号仅有一个判别式的原因。

(2)eg如下:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

2.多重、复杂条件判断式

(1)形式如下:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


(2)eg:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


如果你不希望用户由键盘输入额外的数据时, 可以使用上面提到的参数功能 ($1)!让用户在下达指令时就将参数带进去!现在我们想让用户输入『 hello 』这个关键词时,利用参数的方法可以这样依序设计:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

3.查询到目前主机有开启的网络服务端口:netstat

(1) 目前主机有启动的服务:netstat -tuln

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


解释说明:

  • 上面的重点是『Local Address (本地主机的 IP 与端口口对应)』那个字段,他代表的是本机所启动的网络服务!
  • IP 的部分说明的是该服务位于那个接口上,若为 127.0.0.1 则是仅针对本机开放,若是0.0.0.0 或 ::: 则代表对整个 Internet 开放

(2)如何透过 netstat 去侦测我的主机是否有开启这四个主要的网络服务端口口呢?

(a)几个常见的 port 与相关网络服务的关系是:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


(b)每个服务的关键词都是接在冒号『 : 』后面, 所以可以用类似『 :80 』来侦测的!

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

(3)写个脚本程序来跑,让用户输入他的退伍日期,让你去帮他计算还有几天才退伍?

整个脚本的制作流程有点像这样:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


注意:脚本中的 date_d 变量宣告那个 /60/60/24 是来自于一天的总秒数 (24 小时60 分60 秒)

八、利用 case … esac 判断

(1)case … in … esac 的语法如下

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

  • 这个语法以 case (实际案例之意) 为开头,结尾自然就是将 case 的英文反过来写!就成为 esac 啰!
  • 每一个变量内容的程序段最后都需要两个分号 (;; ) 来代表该程序段落的结束,这挺重要的喔!
  • 至于为何需要有 * 这个变量内容在最后呢?这是因为,如果用户不是输入变量内容一或二时, 我们可以告知用户相关的信息啊!

(2)eg

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

  • 如果你输入『 sh hello-3.sh test 』来执行, 那么屏幕上就会出现『Usage hello-3.sh {hello}』的字样,告知执行者仅能够使用 hello 喔。
  • 这样的方式对于需要某些固定字符串来执行的变量内容就显的更加的方便呢! 这种方式你真的要熟悉喔!

(3)/etc/init.d/netconsole restart与/etc/init.d/netconsole

早期系统的很多服务的启动 scripts 都是使用这种写法的 (CentOS 6.x 以前)。 虽然 CentOS 7 已经使用systemd,不过仍有数个服务是放在 /etc/init.d/ 目录下喔!

例如有个名为 netconsole 的服务在该目录下, 那么你想要重新启动该服务,是可以这样做的 (请注意,要成功执行,还是得要具有 root 身份才行!一般账号能执行,但不会成功! ):

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


(4)case $变量 in中 $变量 的两种获取方式

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


eg:这么说或许你的感受性还不高,好,我们直接写个程序来玩玩:让使用者能够输入 one, two, three ,并且将用户的变量显示到屏幕上,如果不是 one, two, three 时,就告知使用者仅有这三种选择。

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

  • 此时,你可以使用『 sh show123.sh two 』的方式来下达指令,就可以收到相对应的响应了。上面使用的是直接下达的方式
  • 而如果使用的是交互式时,那么将上面第 10, 11 行的 “#” 拿掉, 并将 12行加上批注 (#),就可以让使用者输入参数啰
九、function

1.function的含义

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

2.eg

  • 我们将 show123.sh 改写一下,自定义一个名为 printit 的函数来使用喔
  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


3.function的内建变量

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


解释:

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

十、循环 (loop)

1.while do done, until do done (不定循环)

(1)while 的中文是『当…时』,所以,这种方式说的是『当 condition 条件成立时,就进行循环,直到

condition 的条件不成立才停止』的意思

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


(2)还有另外一种不定循环的方式:

它说的是『当 condition 条件成立时,就终止循环, 否则就持续进行循环的程序段。 』

  • 用 do while的思想去理解
  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

  • (3)eg:假设我要让使用者输入yes 或者是 YES 才结束程序的执行,否则就一直进行告知用户输入字符串
  • 上面这个例题的说明是『当 ${yn} 这个变数不是 “yes” 且 ${yn} 也不是 “YES” 时,才进行循环内的程序。』
  • 而如果 ${yn} 是 “yes” 或 “YES” 时,就会离开循环啰
  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


  • 那如果使用 until 呢?
  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


(4)eg:如果我想要计算 1+2+3+…+100 这个数据呢?

  • 嘿嘿!当你执行了『 sh cal_1_100.sh 』之后,就可以得到 5050 这个数据才对啊!
  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


2.for…do…done (固定循环)

(1)语法

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


以上面的例子来说,这个 $var 的变量内容在循环工作时:

1. 第一次循环时, $var 的内容为 con1 ;
2. 第二次循环时, $var 的内容为 con2 ;
3. 第三次循环时, $var 的内容为 con3 ;
4. ....

(2)eg:设我有三种动物,分别是 dog, cat, elephant 三种, 我想每一行都输出这样:『There are dogs…』之类的字样,则可以

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


eg:由于系统上面的各种账号都是写在 /etc/passwd 内的第一个字段,你能不能透过管线命令的 cut 捉出单纯的账号名称后,以 id 分别检查使用者的标识符与特殊参数呢?由于不同的 Linux 系统上面的账号都不一样!此时实际去捉 /etc/passwd 并使用循环处理,就是一个可行的方案了!

  • 执行上面的脚本后,你的系统账号就会被捉出来检查啦!这个动作还可以用在每个账号的删除、重整上面呢!
  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

  • eg:我想要利用 ping这个可以判断网络状态的指令, 来进行网络状态的实际侦测时,我想要侦测的网域是本机所在的192.168.1.1~192.168.1.100,由于有 100 台主机, 总不会要我在 for 后面输入 1 到 100 吧。
  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

  • 解释:
  • 上面这一串指令执行之后就可以显示出 192.168.1.1~192.168.1.100 共 100 部主机目前是否能与你的
    机器连通! 如果你的网域与鸟哥所在的位置不同,则直接修改上头那个 network 的变量内容即可!

  • 其实这个范例的重点在 $(seq …) 那个位置!那个 seq 是连续 (sequence) 的缩写之意!代表后面接的
    两个数值是一直连续的!

  • 除了使用 $(seq 1 100) 之外,你也可以直接使用 bash 的内建机制来处理喔!可以使用
    {1…100} 来取代 $(seq 1 100) ! 那个大括号内的前面/后面用两个字符,中间以两个小数点来代表连续出现的意思!例如要持续输出 a, b, c…g 的话, 就可以使用『 echo {a…g} 』这样的表示方式!

eg:最后,让我们来玩判断式加上循环的功能!我想要让用户输入某个目录文件名, 然后我找出某目录

内的文件名的权限,该如何是好?

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

3.for…do…done 的数值处理

(1)语法如下

鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

  • 在 for 后面的括号内的三串内容意义为
  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell

  • (2)eg
  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


4.搭配随机数与数组的实验

(1)eg:有没有办法写支脚本,用脚本搭配随机数来告诉我们,今天中午吃啥好?

  • 这个例子中只选择一个样本
  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


  • 如果想要每次都秀出 3 个店家呢? 而且这个店家不能重复喔!
  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell


  • 鸟哥的私房菜基础篇》第四版学习笔记——第12章学习shell