1.脚本的组成和执行
Linux shell 脚本的结构并不复杂, 其主要由变量, 内部命令以及 shell 的语法结构和一些函数, 其他命令行的程序等组成, 以下是一个简单的 shell 脚本.
- #!/bin/bash
- #This is a first script
- echo
- echo Hello Bash Script!
- echo
一般使用后缀名 ".sh" 来表示 shell 脚本, 此脚本中的第一行使用 "#!" 开头, 表明要用 / bin/bash 来解释和执行这个脚本文件, 也可以使用 / bin/sh 来代替. 实际上,/bin/sh 是一个指向 / bin/bash 的软链接(soft link), 也就是说, 在执行 / bin/sh 时, 它调用的命令与 / bin/bash 是相同的. 可以使用如下的命令来查看 / bin/bash 文件.
- autotest@xa-stf-u1804:~/Documents$ ll -la /bin/bash
- -rwxr-xr-x 1 root root 1113504 Apr 4 2018 /bin/bash*
接着是关于这个脚本的一些描述信息, 这些描述信息包括编写脚本的时间, 人物以及脚本的功能等信息, 这也许是为了方便后来对脚本的维护.
之后是脚本所要实现的功能, 这是脚本最为主要的部分, 也是编写脚本的目的. 当脚本编写完成之后保存脚本并退出, 执行脚本可以事先使用 chmod 命令为该脚本文件添加可执行权, 然后再执行, 或者接着使用 bash 后接脚本文件名执行.
[scat@Scat ~]$ chmod u+x helloscript.sh # 添加可执行权
[scat@Scat ~]$ ./helloscript.sh# 执行脚本文件
Hello Bash Script!
[scat@Scat ~]$ bash helloscript.sh# 使用 bash 来执行
Hello Bash Shell Script!
在一个刚创建的脚本文件中, 是没有可执行权限的. 因此在执行它时会出现不允许执行的提示. 而在添加可执行权限之后就可以执行.
2.脚本执行过程的追踪
对于一个刚完成编写的代码程序, 无论技术有多么熟练都难免出现错误, 所出现的这些错误包括语法错误和逻辑错误. 若是遇到语法错误还好, 要是逻辑错误那就麻烦了. 这是因为有逻辑错误的程序可以正常运行, 但所运行的结果并非想要的.
对于所编写的脚本, 可以使用 set 命令进行运行时的跟踪. 利用 set 命令有助于完成代码, 发现代码中的错误以及修改和整理代码, 使得所编写的代码更为完整. 看如下一个名为 test.sh 的脚本.
- #!ban/bash
- #
- #set -x
- echo -n "are you a student?"
- read answer
- if [ $answer = Y ]
- then
- echo "yes,I am a student"
- else
- echo "No,I am a teacher"
- fi
完成脚本的编写之后, 将其保存并退出. 接着进行授权, 然后运行脚本文件. 或者使用 bash 直接运行, 操作如下.
[scat@Scat ~]$ bash test.sh # 执行脚本文件
- are you a student?Y # 输入 Y 确认, 需要大写
- yes,I am a student
[scat@Scat ~]$ bash test.sh
- are you a student?N # 此次输入 N
- No,I am a teacher
以上只是一些简单的输出, 没有任何其他参数的输出. 接着使用 set 命令来实现对脚本的跟踪.
首先开启 set 的功能, 即将 set 命令前面的 #号去掉, 之后保存所做修改并退出, 然后执行 bash 命令.
[scat@Scat ~]$ bash test.sh # 执行 test.sh 文件
- +echo-n 'are you a student?'
- are you a student?+read answer
- Y # 输入 Y, 要大写
- +'[' Y = Y ']'
- yes,I am a student
[scat@Scat ~]$ bash test.sh # 再次执行脚本文件
- +echo-n 'are you a student?'
- are you a student?+read answer
- N # 此次输入 N
- +'[' N = Y ']'
- +echo 'No,I am a teacher'
- No,I am a teacher
在启动 set 命令功能之后, 当执行脚本文件时出现了一些以 "+" 开头的行. 也就是说, 使用 set 命令可对脚本进行完全的跟踪. 可以通过跟踪来发现理想的输出与实际输出的区别, 然后进行修改, 最终达到所需的要求.
3.脚本中的条件测试
下面介绍脚本中的条件测试. 这方面的内容涉及数值的测试, 字符串以及数字等内容.
(1)数值测试
对数值进行测试, 其主要是对两个数值进行比较, 比较的结果包括两个数值相等, 不相等以及大于和小于等, 表中列出了常用的数值关系运算符.
下面演示如何使用这些关系运算符进行数值的测试. 其实, 进行数值比较的测试非常简单. 首先使用编辑器 vi 创建名为 test1.sh 的文件, 然后写入需要测试的数值, 保存之后退出.
- #!ban/bash #
- [ 36 -eq 36 ] # 判断 36 是否等于 36
- echo $?
- echo # 使用 echo 命令输出一个空格
- [ 36 -eq 35 ] # 判断 36 是否等于 35
- echo $?
- echo
- [ 36 -gt 30 ] # 判断 36 是否大于 30
- echo $?
以上的每条判断语句都可以单独来写, 这里为了方便而将它们写在一起进行测试. 完成以上的操作之后, 接着开始执行脚本文件. 注意, 输出 0 表示正确, 也就是说, 条件成立, 而 1 则相反, 执行文件及测试结果如下所示.
[scat@Scat ~]$ bash test1.sh
- 0 # 第一个输出为 0, 说明条件成立
- 1 # 第二个输出为 1, 说明条件不成立
- 0 # 输出 0, 说明条件成立
(2)字符串测试
对于字符串的测试, 可以对单个字符串进行, 也可以对多个字符串进行. 可通过对两个字符串的值进行比较来测试字符串是否相等. 表 15-2 列出了进行字符串测试时常用的关系运算符.
接着演示如何使用这些关系运算符进行字符串的测试. 其实, 进行字符串比较的测试非常简单. 首先创建名为 test2.sh 的脚本文件, 其内容如下.
- 01 #!/bin/bash
- 02 [ "ccc" = "ccb" ]# 使用 "=" 来判断这两个字符串是否相等, 不用双引号也行
- 03 echo $?
- 04 echo
- 05 [ "ccc" != "ccb" ] # 判断字符串是否不相等
- 06 echo $?
- 07 echo
- 08 test2="abc"# 定义 test2 的值为 abc
- 09 [-z $test2 ]# 判断 test2 是否为空
- echo $?
- exit 0
完成以上的写入并进行保存之后, 接着开始执行脚本文件. 执行文件及测试结果如下所示.
- 1 # 输出 1, 表示第一个测试结果的成立
- 0 # 输出 0, 表示测试结果成立
- 1
(3)逻辑操作符
在完成以上脚本文件的创建之后, 到目前为止已经存在 4 个脚本文件. 在这 4 个脚本文件中, 只有一个文件拥有可执行权, 下面使用 ll 命令列出这些脚本文件.
[scat@Scat ~]$ ll
- total 16
- -rwxrw-r-- 1 scat scat 76 Nov 6 14:05 helloscript.sh
- -rw-rw-r-- 1 scat scat 77 Nov 6 19:13 test1.sh
- -rw-rw-r-- 1 scat scat 91 Nov 6 19:23 test2.sh
- -rw-rw-r-- 1 scat scat 159 Nov 6 15:17 test.sh
对于这些文件, 若需要对其类型, 权限以及长度等进行检测时, 可使用文件状态检测运算符 (如表 15-3 所示) 来测试, 如下是一个简单的例子.
- 01 [-x helloscript.sh ] # 判断 helloscript.sh 是否有可执行权
- 02 echo $?
- 03 echo
- 04 [-x test1.sh # 判断 test1.sh 是否有可执行权
- 05 echo $?
完成之后, 将内容进行保存并退出, 之后执行 test3.sh 文件.
- # 输出 0, 表示 helloscript.sh 文件拥有可执行权
- # 输出 1, 表示 test1.sh 没有可执行权
本节的重点是针对多个条件进行测试. 要对多个条件进行测试, 需要使用一些逻辑操作符, 通过逻辑操作符将这些需要进行测试的条件进行连接起来.
shell 所提供的逻辑操作符有逻辑与, 逻辑或和逻辑否这三种, 以下是对各个逻辑运算符的简单介绍.
-a: 逻辑与, 仅当两边的条件都为真时, 结果才为真, 否则为假.
-o: 逻辑或, 只要其中一边的条件为真, 结果就为真.
!: 逻辑否, 当条件为假时, 结果为真.
接着演示如何使用这些逻辑关系运算符进行文件属性的测试. 其实, 进行文件属性的比较测试的操作与之前的操作差不多. 首先使用编辑器创建名为 test4.sh 的文件, 然后写入需要测试的字符串, 之后保存所做修改并退出.
- 01 #!/bin/bash
- 02 #
- 03 [-x helloscript.sh-a-x test2.sh ]
- 04 echo $?
- 05 echo
- 06 [-x helloscript.sh-o-x test2.sh ]
- 07 echo $?
说明:
第 03 行, 当两个文件都有可执行权时为真
第 06 行: 当其中有一个文件有可执行权时为真
完成之后, 将内容进行保存并退出, 之后执行 test4.sh 文件.
[scat@Scat ~]$ bash test4.sh
- 1 # 第一个测试结果为假
- 0 # 第二个测试结果为真
来源: https://www.cnblogs.com/xixiuling/p/10330646.html