Home linux网络专题 Linux服务器 第 13 章 - 编程
第 13 章 - 编程

13.1 从哪儿开始

参考资源:

  • /usr/share/doc/package下的文档和样例

  • Linux Programming Bible (John Goerzen/IDG books)

更详细的文档可以从获得打印版本。

接下来的四个小节中包含了用不同的编程语言编写的脚本样例,该脚本创建一个包含用户帐户信息的文本文件,调用一组进程如newusers程序,将这些信息加入到/etc/passwd。每个脚本均需要一个输入文件,该文件应包含格式如first_name last_name password的行。(这些脚本并不创建真正的用户目录。)

13.2 Shell

理解类Unix系统如何工作的最好方法就是阅读shell脚本。在此,我们就shell编程做个简单的介绍。参阅 来学习更多的错误。

13.2.1 Bash – GNU标准交互式shell

Bash参考资源:

  • bash(1)

  • info bash

  • LDP 作为开始信息。

  • mc /usr/share/doc/bash/examples/ /usr/share/doc/bash/

    (安装bash-doc软件包阅读样例文件。)

  • Learning the bash Shell, 2nd edition (O'Reilly)

一个简短的程序样例(从标准输入端创建帐户信息供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 shells

Debian中有几个软件包提供了POSIX shell:

  • dash (Sarge)

    • Priority: optional

    • Installed-Size: 176

    • 到目前为止最小和最快的 – 最适合用在初始化安装中

  • ash (Woody)

    • Priority: optional

    • Installed-Size: 180

    • 较小和较快的 – 比较适合用在初始化安装中

  • bash

    • Essential: yes

    • Priority: required

    • Installed-Size: 580

    • 较大和多特征的 – 应用了许多扩展

  • pdksh

    • Priority: optional

    • Installed-Size: 408

    • 完全跟 AT&T 的 ksh 类似

如果你想编写具有通用性的shell脚本,最好写POSIX shell脚本。可将/bin/sh链接到ash或(dash)来测试脚本的POSIX兼容性。避免用 bash 化 或 zsh 化的思维去编写脚本。 例如,应避免:

  • if [ foo == bar ] ; then ...

  • diff -u file.c{.orig,}

  • mkdir /foo{bar,baz}

本文档的 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]< filefile重定向到标准输入(或 n)。
     [n1]>;&n2      重定向标准输出(或 n1)到n2。
     2>; file >;&2    重定向标准输出和错误输出到file。
     | command     将标准输出通过管道传递给command。
     2>;&1 | command 将标准输出或错误输出通过管道传递给command

在这里:

  • stdin: 标准输入 (文件描述符 = 0)

  • stdout: 标准输出 (文件描述符 = 1)

  • stderr: 标准错误 (文件描述符 = 2)

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)

  • 错误:1–255 (False)

注意该用法,返回值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 如果file1file2新则返回True。(指修改日期)
     file1 -ot file2 如果file1file2旧则返回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(与当前位置有关)�

Tags: 13  编程  



Shares:Google书签Yahoo书签雅虎收藏夹365Key网摘新浪ViVi百度收藏天极网摘diglog和讯网摘POCO网摘YouNote网摘博拉网天下图摘 spurl blogmarksBlinkListredditdiggDel.icio.us

linux