zoukankan      html  css  js  c++  java
  • Linux Bash Shell快速入门 (三)

    for
    for 循环结构与 C 语言中有所不同,在 BASH 中 for 循环的基本结构是:
    for $var in

    do
    statments
    done
    其中 $var 是循环控制变量,
    是 $var 需要遍历的一个集合,do/done 对包含了循环体,相当于 C 语言中的一对大括号。
    另外如果do 和 for 被写在同一行,必须在 do 前面加上 ";"。
    如: for $var in
    ; do 。
    下面是一个运用 for 进行循环的例子:
    #!/bin/bash

    for day in Sun Mon Tue Wed Thu Fri Sat
    do
    echo $day
    done

    # 如果列表被包含在一对双引号中,则被认为是一个元素
    for day in "Sun Mon Tue Wed Thu Fri Sat"
    do
    echo $day
    done

    exit 0
    注意上面的例子中,在 for 所在那行的变量 day 是没有加 "$" 符号的,
    而在循环体内,echo 所在行变量 $day 是必须加上 "$" 符号的。
    另外如果写成 for day 而没有后面的 in 部分,
    则 day 将取遍命令行的所有参数。如这个程序:
    #!/bin/bash

    for param
    do
    echo $param
    done

    exit 0
    上面这个程序将列出所有命令行参数。for 循环结构的循环体被包含在 do/done 对中,这也是后面的 while、until 循环所具有的特点。

    while
    while 循环的基本结构是:
    while [ condition ]
    do
    statments
    done


    until
    until 循环的基本结构是:
    until [ condition is TRUE ]
    do
    statments
    done
     
    case
    BASH 中的 case 结构与 C 语言中的 switch 语句的功能比较类似,可以用于进行多项分支控制。
    其基本结构是:
    case "$var" in
    condition1 )
    statments1;;
    condition2 )
    statments2;;
    ...
    * )
    default statments;;
    esac
    下面这个程序是运用 case 结构进行分支执行的例子:
    #!/bin/bash

    echo "Hit a key, then hit return."
    read Keypress

    case "$Keypress" in
    [a-z] ) echo "Lowercase letter";;
    [A-Z] ) echo "Uppercase letter";;
    [0-9] ) echo "Digit";;
    * ) echo "Punctuation, whitespace, or other";;
    esac

    exit 0
    上面例子中的第四行 "read Keypress" 一句中的 read 语句表示从键盘上读取输入。这个命令将在本讲义的 BASH 的其他高级问题中讲解。

    break/continue
    熟悉 C 语言编程的都很熟悉 break 语句和 continue 语句。
    BASH 中同样有这两条语句,而且作用和用法也和 C 语言中相同,break 语句可以让程序流程从当前循环体中完全跳出,
    而 continue 语句可以跳过当次循环的剩余部分并直接进入下一次循环。
     
    函数的使用
    BASH 是一个相对简单的脚本语言,不过为了方便结构化的设计,BASH 中也提供了函数定义的功能。
    BASH 中的函数定义很简单,只要向下面这样写就可以了:
    function my_funcname {
    code block
    }
    或者
    my_funcname() {
    code block
    }
    上面的第二种写法更接近于 C 语言中的写法。
    BASH 中要求函数的定义必须在函数使用之前,这是和 C 语言用头文件说明函数方法的不同。
    更进一步的问题是如何给函数传递参数和获得返回值。
    BASH 中函数参数的定义并不需要在函数定义处就制定,而只需要在函数被调用时用 BASH 的保留变量 $1 $2 ... 来引用就可以了;
    BASH 的返回值可以用 return 语句来指定返回一个特定的整数,
    如果没有 return 语句显式的返回一个返回值,
    则返回值就是该函数最后一条语句执行的结果(一般为 0,如果执行失败返回错误码)。
    函数的返回值在调用该函数的程序体中通过 $ 保留字来获得。下面我们就来看一个用函数来计算整数平方的例子:
    #!/bin/bash

    square() {
    let "res = $1 * $1"
    return $res
    }

    square $1
    result=$
    echo $result

    exit 0
    BASH 中的特殊保留字
     保留变量
     随机数
     运算符
     变量的特殊操作
     
    保留变量
    BASH 中有一些保留变量,下面列出了一些:
    $IFS  这个变量中保存了用于分割输入参数的分割字符,默认识空格。
    $HOME  这个变量中存储了当前用户的根目录路径。
    $PATH  这个变量中存储了当前 Shell 的默认路径字符串。
    $PS1  表示第一个系统提示符。
    $PS2  表示的二个系统提示符。
    $PWD  表示当前工作路径。
    $EDITOR 表示系统的默认编辑器名称。
    $BASH  表示当前 Shell 的路径字符串。
    $0, $1, $2, ...
    表示系统传给脚本程序或脚本程序传给函数的第0个、第一个、第二个等参数。
    $#   表示脚本程序的命令参数个数或函数的参数个数。
    $$   表示该脚本程序的进程号,常用于生成文件名唯一的临时文件。
    $   表示脚本程序或函数的返回状态值,正常为 0,否则为非零的错误号。
    $*   表示所有的脚本参数或函数参数。
    $@   和 $* 涵义相似,但是比 $* 更安全。
    $!   表示最近一个在后台运行的进程的进程号。

    随机数
    随机数是经常要用到的,BASH 中也提供了这个功能,请看下面这个程序:
    #!/bin/bash
    # Prints different random integer from 1 to 65536
    a=$RANDOM
    echo $a
    exit 0
    这个程序可以在每次执行的时候随机的打印出一个大小在 1 到 65536 之间的整数。

    运算符
    算术运算符
    + - * / % 表示加减乘除和取余运算
    += -= *= /= 同 C 语言中的含义
    位操作符
    << <<= >> >>= 表示位左右移一位操作
    & &= | |= 表示按位与、位或操作
    ~ ! 表示非操作
    ^ ^= 表示异或操作
    关系运算符
    < > <= >= == != 表示大于、小于、大于等于、小于等于、等于、不等于操作
    && || 逻辑与、逻辑或操作

    变量的特殊操作
    BASH 中还有一些对变量的简洁、快速的操作,大家还记得 "${var}" 和 "$var" 同样是对变量的引用吧,对 ${var} 进行一些变化就可以产生一些新功能:
    ${var-default} 表示如果变量 $var 还没有设置,则保持 $var 没有设置的状态,并返回后面的默认值 default。
    ${var=default} 表示如果变量 $var 还没有设置,则取后面的默认值 default。
    ${var+otherwise} 表示如果变量 $var 已经设置,则返回 otherwise 的值,否则返回空( null )。
    ${varerr_msg} 表示如果变量 $var 已经设置,则返回该变量的值,否则将后面的 err_msg 输出到标准错误输出上。

    BASH 中对返回值的处理
    无论是在 Shell 中对 BASH 脚本返回值的处理,还是在脚本中对函数返回值的处理,都是通过 "$" 系统变量来获得。BASH 要求返回值必须为一个整数,不能用 return 语句返回字符串变量。

    用 BASH 设计简单用户界面
    BASH 中提供了一个小的语句格式,可以让程序快速的设计出一个字符界面的用户交互选择的菜单,该功能就是由 select 语句来实现的,select 语句的语法为:
    select var in
    do
    statments use $var
    done
    上面的语法结构在执行后,BASH 会将
    中的所有项加上数字列在屏幕上等待用户选择,在用户作出选择后,变量 $var 中就包含了那个被选中的字符串,然后就可以对该变量进行需要的操作了。我们可以从下面的例子中更直观的来理解这个功能:
    #!/bin/bash
    OPTIONS="Hello Quit"
    select opt in $OPTIONS; do
    if [ "$opt" = "Quit" ]; then
    echo done
    exit
    elif [ "$opt" = "Hello" ]; then
    echo Hello World
    else
    clear
    echo bad option
    fi
    done
    exit 0
    大家可以试着执行上面的程序,看看是什么执行结果。
    4.3 在 BASH 中读取用户输入
    BASH 中通过 read 函数来实现读取用户输入的功能,如下面这段程序:
    #!/bin/bash
    echo Please enter your name
    read NAME
    echo "Hi! $NAME !"
    exit 0
    上面这个脚本读取用户的输入,并回显在屏幕上。
    另外 BASH 中还提供另外一种称为 here documents 的结构,可以将用户需要通过键盘输入的字符串改为从程序体中直接读入,如密码。下面的小程序演示了这个功能:
    #!/bin/bash

    passwd="aka@tsinghua"
    ftp -n localhost <<ftpftp
    user anonymous $passwd
    binary
    bye
    FTPFTP
    exit 0
    这个程序在用户需要通过键盘敲入一些字符时,通过程序内部的动作来模拟键盘输入。请注意 here documents 的基本结构为:
    command <<somespecialstring
    statments
    ...
    SOMESPECIALSTRING
    这里要求在需要键盘输入的命令后,直接加上 <<符号,然后跟上一个特别的字符串,在该串后按顺序输入本来应该由键盘输入的所有字符,在所有需要输入的字符都结束后,重复一遍前面 <<符号后的“特别的字符串”即表示该输入到此结束。
    4.4 一些特殊的惯用法
    在 BASH 中 () 一对括号一般被用于求取括号中表达式的值或命令的执行结果,如:(a=hello; echo $a) ,其作用相当于 `...` 。
    : 有两个含义,一是表示空语句,有点类似于 C 语言中的单个 ";" 。表示该行是一个空命令,如果被用在 while/until 的头结构中,则表示值 0,会使循环一直进行下去,如下例:
    while :
    do
    operation-1
    operation-2
    ...
    operation-n
    done
    另外 : 还可以用于求取后面变量的值,比如:
    #!/bin/bash
    : ${HOSTNAME} {USER} {MAIL}
    echo $HOSTNAME
    echo $USER
    echo $MAIL
    exit 0
    在 BASH 中 export 命令用于将系统变量输出到外层的 Shell 中了。

    BASH 程序的调试
    用 bash -x bash-script 命令,可以查看一个出错的 BASH 脚本到底错在什么地方,可以帮助程序员找出脚本中的错误。
    另外用 trap 语句可以在 BASH 脚本出错退出时打印出一些变量的值,以供程序员检查。trap 语句必须作为继 "#!/bin/bash" 后的第一句非注释代码,一般 trap 命令被写作: trap 'message $checkvar1 $checkvar2' EXIT 。

    关于 BASH2
    使用 bash -version 命令可以看出当前你正在使用的 BASH 是什么版本,一般版本号为1.14或其他版本。而现在机器上一般还安装了一个版本号为 2.0 的 BASH 。该 BASH 也在 /bin 目录下。BASH2 提供了一些新功能,有兴趣的同叙可以自己去看相关资料,或直接 man bash2 即可。

    备注:随笔中内容来源于网上资料整理,仅供参考。

  • 相关阅读:
    观察者模式
    模版方法
    event
    设计模式之观察者模式
    BOM
    javascript基础语法&4
    Document Object Model
    javascript基础语法&3
    javaScript基础语法&1
    sublimeText3安装
  • 原文地址:https://www.cnblogs.com/Alanf/p/7761238.html
Copyright © 2011-2022 走看看