linux-运维进阶-09 编写Shell脚本
可以将Shell终端解释器当作人与计算机硬件之间的“翻译官”,它作为用户与Linux系统内部的通信媒介,除了能够支持各种变量与参数外,还提供了诸如循环、分支等高级编程语言才有的控制结构特性。
- 交互式(Interactive):用户每输入一条命令就立即执行。
- 批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令。
指定解释器
脚本的第一行
用于指定脚本使用哪个shell程序做为脚本中命令的解释器
使用bash做为脚本命令的解释器
1 | #!/bin/bash |
使用zsh做为脚本的命令解释器
1 | #!/bin/zsh |
创建一个脚本
1 | [root@localhost ~]# vim hello.sh |
执行一个脚本
1 | [root@localhost ~]# ./hello.sh |
添加执行权限
脚本写完后运行,利用./执行发现权限不够。Linux文件创建之后默认是没有可执行权限的,可以用chmod给文件或目录添加上可执行权限
1 | [root@localhost ~]# ll |
注意,一定要写成 ./hello.sh ,而不是 hello.sh,运行其它二进制的程序也一样,直接写 hello.sh,linux 系统会去 PATH 里寻找有没有叫 hello.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 hello.sh 是会找不到命令的,要用 ./hello.sh 告诉系统说,就在当前目录找。
上面两次ll出来的文件列表,是为了对比出添加权限前后文件权限的变化,x表示可执行。
没有执行权限情况下想要执行脚本的两种方式
1 | 首先咱们在新建一个脚本 |
解释器后面跟上脚本
1 | [root@localhost ~]# bash aaa.sh |
点加空格后面跟上脚本或者脚本的全路径
1 | [root@localhost ~]# . aaa.sh |
Shell脚本执行的几种方法
在脚本拥有可执行权限之后,我们就可以去执行脚本,执行脚本有以下几种方式:
在脚本所在目录下时
1 | [root@localhost ~]# ./hello.sh |
不在脚本所在目录下时
1 | [root@localhost ~]# mkdir -p a/b/c/d |
接受用户的参数
脚本的参数就是脚本后面跟的用户输入的选项或者是变量
在脚本中
- 脚本的名字使用$0来表示
- 脚本的参数个数使用$#表示
- 脚本的第N个参数使用$N表示(例如脚本第三个参数$3)
1 | [root@localhost ~]# vim hello.sh |
执行该脚本:
1 | [root@localhost ~]# bash hello.sh 1 2 3 4 5 |
判断用户参数(下面两种写法)
1 | [root@localhost ~]# vim isroot.sh |
执行该脚本:
1 | [root@localhost ~]# bash isroot.sh |
可用的整数比较运算符
运算符 | 作用 |
---|---|
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
常见的字符串比较运算符
运算符 | 作用 |
---|---|
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
1 | [root@localhost ~]# [ $LANG="EN.US.UTF-8" ]&&echo "is English" |
Shell中的四则运算
注意:方括号外取值符号$不能少,方括号内一定要用空格把方括号和里面的命令隔开
1 | [root@localhost ~]# i=$[10 * 10] |
写一个判断内存是否够用的脚本
1 | [root@localhost ~]# vim isfree.sh |
输入:
1 | #!/bin/bash |
执行:
1 | [root@localhost ~]# bash isfree.sh |
if流程控制语句
上面判断用户参数时,我们已经使用过了if语句
现在再来一次
linux shell 中判断文件、目录是否存在
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
1 | [root@localhost ~]# vim 1.sh |
输入:
1 | #!/bin/bash |
1 | [root@localhost ~]# bash 1.sh |
判断主机是否能正常访问百度的脚本
1 | [root@localhost ~]# vim baidu.sh |
输入:
1 | #!/bin/bash |
1 | [root@localhost ~]# bash baidu.sh |
判断成绩的脚本
1 | [root@localhost ~]# vim result.sh |
1 | #!/bin/bash |
1 | [root@localhost ~]# bash result.sh |
for循环
题目:在linux上创建一个脚本,名为/root/makeusers,此脚本能实现为系统创建本地用户,并且这些用户的用户名来自一个包含用户名列表的文件。
同时满足下列要求:
此脚本要求提供一个参数,此参数就是包含用户列表的文件
如果没有提供参数,此脚本应该给出下面的提示信息 Usage:/root/makeusers
如果提供一个不存在的文件名,此脚本应该给出下面的提示信息 Input file not found 然后退
出并返回相应的值
创建的用户登录 shell 为/bin/false,此脚本不需要为用户设置密码
首先,了解一下新建用户的命令:
1 | [root@localhost ~]# useradd -s /bin/fasle "testuser" |
通过cat命令查看所有用户信息,可以看到用户testuser已经成功创建出来了
现在开始写脚本:
1 | [root@localhost ~]# vim foruser.sh |
1 | #!/bin/bash |
新建一个包含用户名的文件,里面随便设置几个用户
1 | [root@localhost ~]# vim user.txt |
1 | aaa |
执行脚本
1 | [root@localhost ~]# bash foruser.sh user.txt |
可以看到几个用户已经被成功添加了!
把for循环改成wheel循环的写法
另外再写一个脚本:
1 | [root@localhost ~]# vim wheeluser.sh |
1 | #!/bin/bash |
重新编辑一下user.txt
1 | [root@localhost ~]# vim user.txt |
1 | aaawww |
执行脚本
1 | [root@localhost ~]# bash wheeluser.sh user.txt |
可以看到几个用户已经被成功添加了!
case语句
在 linux上创建一个名为/root/script.sh 的脚本,让其提供下列特性:
当运行/root/script.sh all,输出为 none
当运行/root/script.sh none,输出为 all
当没有任何参数或参数不是 all 或者 none 时,其错误输出产生以下的信息:
1 | /root/script.sh all|none |
开始写脚本
1 | [root@localhost ~]# vim script.sh |
1 | #!/bin/bash |
执行脚本:
1 | [root@localhost ~]# bash script.sh all |