Shell 入门基本知识 __ 第二部分

首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

Shell 入门基本知识 __ 第二部分

作者:  时间: 2011-04-03

5. 条件控制:有时需要判断字符串是否相等,需要判断文件状态,对数字进行测试。

对文件、字符串和数字使用 test 命令;对数字、字符串还可使用 expr 命令。

命令格式: $test condition    或: [ condition ] 注意 []与条件必须有空格。

5.1. 文件状态测试:test 状态  或  [ 状态 ]

1 [ -e file ] 文件存在
2 [ -d directory ] 目录存在
3 [ -s file ] 文件大小大于0
4 [ -r file ] 文件可读
5 [ -b file ] 区块文件
6 [ -c file ] 字符文件
7 [ -f file ] 一般/正规文件
8 [ -w file ] 文件可写
9 [ -x file ] 文件可执行
10 [ -k file ] 设定了限定位
11 [ -g file ] 设定了组位
12 [ -u file ] 设定了 user id

5.2. 逻辑操作符:-a 逻辑与;  -o  逻辑或; ! 逻辑否。

5.3. 字符串测试:命令格式, test string; test string_operator string;test string string_operator string;

[ string_operator string ]; [ string string_operator string ]

1 = 相等
2  != 不等
3  -z 空串
4  -n 非空

5.4. 数值测试:"number" numeric_operator "number"  [ "number" numeric_operator "number" ]

1 -eq 等于
2  -ne 不等于
3  -gt 大于
4 -lt 小于
5 -le 小于等于
6 -ge 大于等于

5.5. expr 用法:expr argument operator argument #operator 为 +,-,*,/,% 等。可用在增量计数,数值测试或模式匹配上。

6. 控制流结构。流控制 and 循环。

6.1. 流控制。if, then, else: 条件测试。 case : 匹配模式、单词或值。

1 # if - then - else 语法格式
2 if 条件1
3 then
4 命令1
5 elif 条件2
6 命令2
7 else
8 命令3
9 fi
10
11 # case 语句
12 case 值 in
13 模式1)
14 命令1
15 ...
16 ;;
17 模式2)
18 命令2
19 ...
20 ;;
21 esac

6.2. 循环。for 循环; until 循环; while 循环。break: 跳出循环。 continue: 不会跳出循环,跳过本次循环,进入下一次循环。

1 # for 循环
2 for 变量名 in 列表
3 do
4 命令1
5 命令2
6 ...
7 done
8
9 # until 循环
10 until 条件
11 条件1
12 条件2
13 done
14
15 # while 循环
16 while 条件
17 do
18 命令1
19 命令2
20 ...
21 done

7. shell 函数。

1 # 情况一:
2 函数名()
3 {
4 命令1
5 命令2
6 ...
7 }
8
9 # 情况二:
10 function 函数名()
11 {
12 命令1
13 命令2
14 ...
15 }

参数传递:向函数传递参数就是在脚本中使用位置变量:$1, $2, ... $9, 函数取得所传参数后,将原始参数传回 shell 脚本,因此最好先在函数内重新设置变量保存所传的参数。这样如果函数有一点错误,就可以通过已经本地化的变量名迅速加以跟踪。函数里调用参数(变量)的转换以下划线开始,后加变量名。

函数的返回:返回状态值,不能当成变量的返回对待。使用 return 返回脚本中函数调用的下一语句,可以带返回值。return : 从函数返回,用最后状态命令决定返回值。return 0 : 无错误返回。 return 1 : 有错误返回。

8. 向脚本传递参数。( shift, getopts )

shift : 向脚本传递参数时,有时需要将一个参数偏移以处理选项,这就是 shift 命令的功能。 shift 每次将参数位置向左偏移一位。

1 #!/bin/bash
2 # shift
3 loop=0
4 while [ $# -ne 0 ]
5 do
6 echo $1
7 shift
8 done

getopts : 可以编写脚本,使控制多个命令行参数更加容易。用于形成命令行处理标准形式。一般来说,脚本应该具有确认带有多个选项的命令文件标准格式的能力。

一般格式: getopts option_string variable 。 getopts 读取 option_string, 获知脚本中使用了有效选项,getopts 查看所有以连字符 "-" 开头的参数,使其视为选项。有时有必要在脚本中指定命令行选项取值。getopts 为此提供了一种方式,即在 option_string 中将一个冒号":" 放在选项后,如 getopts ahfvc: OPTION, 使用选项取值时,必须使用变量 OPTARG 保存该值。

9. shell 文本程序的可执行化。:将文本的 shell script 文件设为可执行的 shell stript。对任何操作系统来说,文本文件都不具备直接执行的功能。

Dos 系统通过赋予批处理文件( .bat )类型,使之执行。

Unix 系统则采用将 shell script 文件权限设定为 可执行 。

1 chmod u+x filename 只有用户自己可执行,其他人不能执行
2 chmod ug+x filename 只有用户和同组人可执行
3 chmod a+x filename 所有人都可以执行

10. 调试。

最简单的调试命令当然是使用echo命令。您可以使用echo在任何怀疑出错的地方打印任何变量值。这也是绝大多数的shell程序员要花费80%的时间来调试程序的原因。Shell程序的好处在于不需要重新编译,插入一个echo命令也不需要多少时间。  shell也有一个真实的调试模式。如果在脚本"strangescript" 中有错误,您可以这样来进行调试:  

sh -x strangescript #这将执行该脚本并显示所有变量的值。

sh -n strangescript #只是检查语法的模式,返回所有的语法错误。

11. shell 的嵌入命令列表。

1 命令名称 命令解释
2 : 空,永远返回为空
3 . 从当前shell中执行操作
4 break 退出for,while,until,case语句
5 cd 改变当前目录
6 continue 执行循环的下一步
7 echo 反馈信息到标准输出
8 eval 读取参数,执行结果命令
9 exec 执行命令,但不在当前shell
10 exit 退出当前shell
11 export 导出变量,使当前shell可利用它
12 pwd 显示当前目录
13 read 从标准输入读取一行文本
14 readonly 设置变量为只读
15 return 退出函数并带有返回值
16 set 控制各种参数到标准输出的显示
17 shift 命令行参数向左偏移一个
18 test 条件测试
19 times 显示用户脚本或任何系统命令的运行时间,第一行给出shell消耗时间,第二行给出运行命令消耗的时间
20 trap 当捕获信号时运行指定命令
21 ulimit 显示或设置shell资源
22 umask 显示或设置缺省文件创建模式
23 unset 从shell内存中删除变量或函数
24 wait 等待直到子进程运行完毕,报告终止
25 type 查询命令是否驻留系统以及该命令的类型

12. 常用 shell 命令:

basename, cat, compress, diff, dircmp, head, more, pg, tail, logname, sleep, strings, whereis, who, whoani, find, grep, awk, sed, sort, uniq, join, split, tr ...