一.定义:
- shell:一个命令行界面与系统沟通的接口.
-
script:脚本,可以搭配正则表达式,管道命令,数据流重定向功能.
引用鸟哥的话shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文字档,将一些 shell 的语法与命令(含外部命令)写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的。
它类似与早期DOS年代的批处理文件(.bat)它把多个命令写在一起,用户就能一次处理多个操作. 命令执行顺序:左->右,上->下.
- 命令参数太多的话,可以用+回车进入下一行继续敲,相当于回车加了个转义字符,则表示输入未完成
- “#”后面可以接注释,在#后面数据会被视为批注文字而忽略.
编写第一个script:
我们vim sho1.sh 创建一个(最好用vim代替vi) 因为vim可以简单自动检测语法错误,还有略带炫酷的颜色.
注意第一行(这一行并不是注释)
#!/bin/bash 声明了这个 script 使用的 shell 名称:
因为我们使用的是 bash ,所以,要以『 #!/bin/bash 』来宣告这个文件内的语法使用 bash 的语法!那么当这个程序被运行时,从而加载 bash 的相关环境配置档 (即是,non-login shell 的 ~/.bashrc), 并且运行 bash 来使我们底下的命令能够运行!
除了第一行之外 后面的批注就是说明程序的大概功能 时间 和作者,PATH是设置变量路径.
按鸟哥的建议是:最后每写一个脚本程序进行批注,方便后期维护和查询.
除了第一行的『 #! 』是用来宣告 shell 的之外,其他的 # 都是『注解』用途! 所以上面的程序当中,第二行以下就是用来说明整个程序的基本数据。一般来说, 建议你一定要养成说明该 script 的:1. 内容与功能; 2. 版本资讯; 3. 作者与联络方式; 4. 建档日期;5. 历史纪录 等等。这将有助於未来程序的改写与 debug 呢!
运行脚本 输入:sh sh01.sh或者bash sh01.sh结果如下,
再来个例子:
其中的read -p后面接的是提示语句 之后我们定义了变量firstname 并且由用户输入
我们man echo查询一下
echo -e表示的是 允许后面的输出进行转义 ,所以我们双引号内的\n就可以表示换行.
另外这里可以看到vim编辑器可以自动检错 由于我双引号不匹配它会显示颜色落差.
保存退出后执行如下:
script执行方式的区别
- 通过bash(sh)来执行脚本,该script会使用一个新的bash环境来执行脚本内的命令,即在这种情况script会在子进程的bash内进行,因此变量的值并不会传回父进程.
(图片出处鸟哥linux私房菜电子版) - 通过source执行脚本,在父进程运行,设置会写入系统并且生效.
(图片出处鸟哥linux私房菜电子版)
例子如下:
我们刚刚明明输入给firstname 和lastname 赋值,然而echo居然为空.
如果我们用source,结果就是永久了.(要想解除变量可以用命令:unset + 变量)
强大的test命令测试功能
常用参数:
- -e :测试文件存在与否
- -f,-d :测试类型是否为file,directory
-
-nt,-ot 例如 :test file1 -nt file2 测试file1是否比file2新
整数判定:
-eq :是否相等(equal)
- -ne :是否不想等(not equal)
- -gt,-lt :大于,小于
简单判断:
这里用到了逻辑运算符 && 和 || 旨在判断当前目录是否存在sh01.sh这个文件
比较字符串:
-
判断符号[ ]
用中括号[]也可以用来判断条件的真假性.
[ “$firstname” = “D” ] 这个会返回0
不过有几个要注意:- 中括号每个组件都要用空格分隔
- 变量常量都用双引号括起来
比如:
如果不加引号,遇到这种情况会报异常:
我们设置D这个变量值为 “D h”
如果没加双引号放 []中系统会误解为
[ D h == “D”] 等号左右两边一共有3个数据,则会提示太多参数的错误.
因此最后习惯性对变量加双引号:
带参数执行shell script:
先vim 创建一个script ,用来表示某些script 设置参数的变量:
其中:
- $0 表示脚本名字
- $# 表示所有参数个数
- $* 则会罗列所有参数 把*换成@ 也可以.
-
$+数字n 表示第n个参数
结果如下:
参考<鸟哥Linxu私房菜基础学习篇>p373-384