| 第 13 章 - 编程 |
13.1 从哪儿开始参考资源:
更详细的文档可以从获得打印版本。 接下来的四个小节中包含了用不同的编程语言编写的脚本样例,该脚本创建一个包含用户帐户信息的文本文件,调用一组进程如newusers程序,将这些信息加入到/etc/passwd。每个脚本均需要一个输入文件,该文件应包含格式如first_name last_name password的行。(这些脚本并不创建真正的用户目录。) 13.2 Shell理解类Unix系统如何工作的最好方法就是阅读shell脚本。在此,我们就shell编程做个简单的介绍。参阅 来学习更多的错误。 13.2.1 Bash – GNU标准交互式shellBash参考资源:
一个简短的程序样例(从标准输入端创建帐户信息供newusers使用): #!/bin/bash
# (C) Osamu Aoki Sun Aug 26 16:53:55 UTC 2001 Public Domain
pid=1000;
while read n1 n2 n3 ; do
if [ ${n1:0:1} != "#" ]; then
let pid=$pid+1
echo ${n1}_${n2}:password:${pid}:${pid}:,,,/home/${n1}_${n2}:/bin/bash
fi
done
13.2.2 POSIX shellsDebian中有几个软件包提供了POSIX shell:
如果你想编写具有通用性的shell脚本,最好写POSIX shell脚本。可将/bin/sh链接到ash或(dash)来测试脚本的POSIX兼容性。避免用 bash 化 或 zsh 化的思维去编写脚本。 例如,应避免:
本文档的 shell 描述,只适用于 POSIX 类型的 shell,不适用于包括 tcsh 在内的 csh 类型。 13.2.3 Shell参数几个需要记住的特殊参数: $0 = shell名称或shel脚本名称
$1 = 第一个(1)shell参数
...
$9 = 第九个(9)shell参数
$# = 位置参数的个数
"$*" = "$1 $2 $3 $4 ... $n"
"$@" = "$1" "$2" "$3" "$4" ... "$n"
$? = 最近执行的命令的退出状态
$$ = 当前shell脚本的PID
$! = 最近启动的后台作业的PID
需要记住的基本扩展参数: 形式 如果设置了 var 如果没有设置 var
${var:-string} $var string
${var:+string} string null
${var:=string} $var string
(并且执行var=string)
${var:?string} $var (返回string然后退出)
在此,冒号“:”在所有运算表达式中事实上均是可选的。
需要记住的替换参数: 形式 结果
${var%suffix} 删除位于var结尾的suffix最小匹配模式
${var%%suffix} 删除位于var结尾的suffix最大匹配模式
${var#prefix} 删除位于var开头的prefix最小匹配模式
${var##prefix} 删除位于var开头的prefix最大匹配模式
13.2.4 Shell重定向需要记住的基本重定向(redirection)运算符(在此[n]表示定义文件描述符的可选参数): [n]>; file 重定向标准输出(或 n)到file。
[n]>;>; file 重定向标准输出(或 n)到file。
[n]< file 将file重定向到标准输入(或 n)。
[n1]>;&n2 重定向标准输出(或 n1)到n2。
2>; file >;&2 重定向标准输出和错误输出到file。
| command 将标准输出通过管道传递给command。
2>;&1 | command 将标准输出或错误输出通过管道传递给command。
在这里:
shell 允许你通过使用 exec 内嵌一个任意的文件描述符来打开文件。 $ echo Hello >;foo
$ exec 3<foo 4>;bar # 打开文件
$ cat <&3 >;&4 # 重定向标准输入到 3,标准输出到 4
$ exec 3<&- 4>;&- # 关闭文件
$ cat bar
Hello
在这里, n<&- 和 n>;&- 表示关闭文件描述符 n。 13.2.5 Shell条件表达式每条命令均可返回一个退出状态,这个状态值可用于条件表达式:
注意该用法,返回值0用来表示“true”与计算机其它领域中常见的转换是不同的。另外`['等阶于使用test命令进行参数赋值`]'相当于一个条件表达式。 需要记住的常用基本条件表达式: command && if_success_run_this_command_too || true
command || if_not_success_run_this_command_instead
if [ conditional_expression ]; then
if_success_run_this_command
else
if_not_success_run_this_command
fi
当 shell 使用 -e 调用的时候, 需要使用 || true 来确保这个 shell 不会在本行意外退出。 在条件表达式中使用的文件比较运算符有: -e file file存在则返回True。
-d file file存在且是一个目录则返回True。
-f file 如果file存在且是一个普通文件则返回True。
-w file 如果file存在且可写则返回True。
-x file 如果file存在且可执行则返回True。
file1 -nt file2 如果file1比file2新则返回True。(指修改日期)
file1 -ot file2 如果file1比file2旧则返回True。(指修改日期)
file1 -ef file2 如果两者是相同的设备和具有相同的结点(inode)数则返回True。
条件表达式中使用的字符串比较运算符有: -z str 如果str长度为零则返回True。 -n str 如果str长度为非零则返回True。 str1 == str2 如果字符串相等则返回True。 str1 = str2 如果字符串相等则返回True。 (使用"=="代替"="符合严格意义上的POSIX兼容) str1 != str2 如果字符串不相等则返回True。 str1 < str2 如果str1排在str2之前则返回True(与当前位置有关)。 str1 >; str2 如果str1排在str2之后则返回True(与当前位置有关)�
|
||||