第二章 bash shell 脚本介绍
学习linux/unix 编程 shell脚本毕不少。 本文只有全面介绍,详细介绍查阅相关资料。只让读者对脚本有个简单了解。现实中也不大可能把所有记住,只要有印象出来查阅资料就行。
(1)基本结构
1> shbang 脚本文件的第一行 通知内核使用那种脚本解释器 #!后面跟解释器路径名 eg:#!bin/bash
2> 注释 以#开始的行
3> 通配符 包括正则表达式 * ? [] 还有I/O重定向 管道 | 等,具体查阅相关知识
4> 显示输出 echo 命令
5> 局部变量 eg:varname=value1 myname=“wxr” itegerNum=10
6> 全局变量 eg: export varname=value1 declare -x varname=value1
7> 提取变量 eg:echo $varname
8> 读取用户输入 eg: read name
9> 命令行参数 $1 $2 $3 ... 位置参数 $* 或者$@ 所有位置参数 是个数组 $# 参数个数
10>数组 declare -a 声明变量 下标从0 开始访问 eg:declare -a fruit=(apple pears) echo ${fruit[0]}
11> 命令替换 命令可以赋值给一个变量 或者单引号来引用 eg: var = 'date' 或者$(date) echo $var
12> 算数运算 eg:((n=5+5)) echo $n
13> 关系运算符与逻辑运算符 同C语言
14> 条件语句 if then .... fi 结构 case 结构
15> 循环结构 while untill for selcet
16> 函数 fuction fuctionname {} 或者 fuctionname() {}
(2) 条件测试test
之所以单独讲这个命令 是因为在shell脚本中经常要使用这个命令 命令test或[ 可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status 为0 如果测 试结果为假,则命令的Exit Status 为1 (注意与C 语言的逻辑表示正好相反)
test 有两种格式 eg : test -d Dir [ -d dir ]
[ -d DIR ] 如果DIR 存在并且是一个目录则为真
[ -f FILE] 如果FILE存在且是一个普通文件则为真
[ -z STRING ] 如果STRING 的长度为零则为真
[ -n STRING ] 如果STRING 的长度非零则为真
[ STRING1= STRING2 ] 如果两个字符串相同则为真
[ STRING1!= STRING2 ] 如果字符串不相同则为真
[ ARG1 OP ARG2 ] ARG1和ARG2应该是整数或者取值为整数的变量,OP是-eq (等于)-ne(不等于)-lt (小于)-le (小于等于)-gt (大于)-ge (大于等于)之中的一个
[ ! EXPR ] EXPR可以是上表中的任意一种测试条件,! 表示逻辑反
[ EXPR1 -a EXPR2] EXPR1和EXPR2可以是上表中的任意一种测试条件,-a表示逻辑与
[ EXPR1 -o EXPR2] EXPR1和EXPR2可以是上表中的任意一种测试条件,-o表示逻辑或
(3) 正则表达式
正则表达式就是字符 数量 位置的字符匹配。之所以在这里讲正则表达式 完全是因为它在shell 字符串处理中常用 。
1> 字符类
. 匹配任意一个字符 eg: abc.可以匹配abcd、abc9等
[] 匹配括号中的任意一个字符 eg:[abc]d 可以匹配ad、bd或cd
- 在[]括号内表示字符范围 eg: [0-9a-fA-F] 可以匹配一位十六进制数字
^位于[]括号内的开头,匹配除括号中的字符之外的任意一个字符
2> 数量类
? 紧跟在它前面的单元应匹配零次或一次 eg:[0-9]?\.[0-9] 匹配0.0 、2.3 、.5等,由于. 在正则表达式中是一个特殊字符,所以需要用\ 转义一下
+ 紧跟在它前面的单元 应匹配一次或多次 eg:[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9_.-]+匹配email地址
* 紧跟在它前面的单元应匹配零次或多次 eg:[0-9][0-9]* 匹配至少一位数字,等价于[0-9]+ ,[a-zA-Z_]+[a-zA-Z_0-9]*匹配C 语言的标识符
{N} 紧跟在它前面的单元应精确匹配N 次 eg:[1-9][0-9]{2} 匹配从100 到999 的整数
{N,} 应匹配至少N 次[1-9][0-9]{2,}匹配三位以上(含三位)的整数
{,M} 紧跟在它前面的单元 应匹配最多M 次 eg: [0-9]{,1}相当于[0-9]?
{N,M}紧跟在它前面的单元应匹配至少N 次,最多M 次
3> 位置限定类
^ 匹配行首的位置
$ 匹配行末的位置 eg: ;$匹配位于一行结尾的;
\< 匹配单词开头的位置 eg: \<th匹配... this ,但不匹配ethernet 、tenth
\> 匹配单词结尾的位置
\b 匹配单词开头或结尾的位置
\B 匹配非单词开头和结尾的
(4) 范例
判断输入参数个数
#!/bin/sh # remember - An easy command-line-based memory pad. rememberfile="$HOME/.remember" if [ $# -eq 0 ] ; then echo "Enter note, end with ^D: " else echo "$@" >> $rememberfile fi
(5) shell 脚本调试方法
-n 读一遍脚本 ,检查语法错误 eg:sh -n ./test.sh
-v 一边执行脚本 一边将执行过的脚本错误打印到标准错误流
-x 将每条执行的命令和结果打印出来
有三种方法
1> 命令行参数 eg:sh -n ./test.sh
2> 脚本开始行 !/bin/bash -x
3> 程序中使用set 开启 关闭 set -x set +x