linux中shell常用语法

test

test是shell中最常用的操作运算,通常的用法是使用一个方括号来表示判断,如果为真则返回 1,为假则返回 0.可以将其用在条件 判断或循环中,如:

    if [expression -r expression] ; then ....
    while [expression -r expression] ; then ....
    until [expression -r expression] ; then ....

一般test判断语句分为以下几种:

  • 文件运算,常用的有:

    [-d file]  如果文件为一个目录,则为真
    [-e file]  如果文件存在,则为真
    [-f file]  如果文件为一个普通文件,则为真
    [-w file]  如果文件可写,则为真
    [-O file]  如果文件存在并且归该用户所有,则为真
    
    [file1 -ef file2]  测试以判断两个文件是否与同一个设备相连,是否拥有相同的 inode 编号
    [file1 -nt file2]  测试以判断第一个文件是否比第二个文件更新(由修改日期决定)
    [file1 -ot file2]  测试以判断第一个文件是否比第二个文件更旧
    
  • 字符串运算,常用的有

    test string  测试以判断字符串是否不为空
    [-n string]  测试以判断字符串是否不为空;字符串必须为 test 所识别
    [-z string]  测试以判断字符串是否为空;字符串必须为 test 所识别
    [string1 = string2]  测试以判断 string1 是否与 string2 相同
    [string1 != string2]  测试以判断 string1 是否与 string2 不同
    
  • 整数比较运算

    [int1 -eq int2]  如果 int1 等于 int2,则为真
    [int1 -ge int2]  如果 int1 大于或等于 int2,则为真
    [int1 -gt int2]  如果 int1 大于 int2,则为真
    [int1 -le int2]  如果 int1 小于或等于 int2,则为真
    [int1 -lt int2]  如果 int1 小于 int2,则为真
    [int1 -ne int2]  如果 int1 不等于 int2,则为真
    
  • 布尔运算符

    test ! expr  如果表达式评估为假,则为真
    [expr1 -a expr2]  如果 expr1 和 expr2 评估为真,则为真
    [expr1 -o expr2]  如果 expr1 或 expr2 评估为真,则为真
    

shell控制流

  • if、then、elif、else、fi,条件判断

      if [ -f /bin/bash ]
      then echo "/bin/bash is a file"
      else echo "/bin/bash is NOT a file"
      fi
      if :; then echo "always true"; fi
    

如上例中如果要在一行中表示多行表达式,必须用分号隔开,如果条件判断中出现 : ,则表示条件判断始终为真。

  • case、esac,多路选择

      case "$YES_OR_NO" in
      yes|y|Yes|YES)
      echo "Good Morning!";;
      [nN]*)
        echo "Good Afternoon!";;
      *)
        echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
        exit 1;;
      esac
      exit 0
    
  • for、while,循环执行

      for FRUIT in apple banana pear; do
         echo "I like $FRUIT"
      done
    
      COUNTER=1
      while [ "$COUNTER" -lt 10 ]; do
         echo "Here we go again"
         COUNTER=$(($COUNTER+1))
      done
    

shell的参数

  • shell参数为shell编程提供了很大的灵活性

    $0          shell的命令名称,相当于C语言main函数的argv[0]
    $1、$2...  这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]、argv[2]...
    $#          shell的参数个数,相当于C语言main函数的argc - 1
    $@          表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。
    $?          上一条命令的Exit Status
    $$          当前Shell的进程号
    

shell中还有一个比较有用的命令:shift,shift n表示参数列表左移n位,但是$0不变,不带参数默认shift 1。

shell函数

  • shell函数和c语言很像,但是它没有参数列表也没有返回值,参数是在调用的时候传入的,执行结果为0还是1来作为返回值

    is_directory()
    {
      DIR_NAME=$1
      if [ ! -d $DIR_NAME ]; then
        return 1
      else
        return 0
    fi
    }
    
    for DIR in "$@"; do
      if is_directory "$DIR"
        then :
      else
        echo "$DIR doesn't exist. Creating it now..."
        mkdir $DIR > /dev/null 2>&1
        if [ $? -ne 0 ]; then
            echo "Cannot create directory $DIR"
            exit 1
        fi
      fi
    done
    

warden中的shell命令

本部分中的命令是从warden的源代码中摘出来的,为了能够顺利地看懂warden源代码,我将这些拦路虎一一列出来。

  • set,在set之后使用-o参数将特殊特性打开.使用+o参数将关闭某些特性,可以set -o查看当前的shell变量设置情况

    set -o errexit  如果一个命令返回一个非0退出状态值(失败),就退出。
    set -o nounset  在扩展一个没有的设置的变量的时候,显示错误的信息。
    set -o xtrace   打开调试回响模式
    
  • shopt,是set命令的一个拓展,“-u”开关表示一个复位的选项,“-s”表示选项当前被设置(打开)。可以使用shopt -p来查看当前的设置。

    shopt -s nullglob  设置nullglob选项,bash允许没有匹配任何文件的文件名模式扩展成一个空串,而不是它们本身
    
  • unshare,在指定的环境下执行命令,而不影响上一级的环境。

  • grep -q -i ubuntu /etc/issue 判断系统是否是ubuntu

    lsb_release -cs 得到系统的版本类型

  • mknod,建立设备特殊文件:

    mknod DEVNAME {b | c}  MAJOR  MINOR
    

    DEVNAME表示设备文件名,b|c分别代表块设备和字符设备,MAJOR、MINOR风别表示主设备号和次设备号。

  • mount,linux下挂载文件系统

    mount [-t vfstype] [-o options] device dir
    

    -t后面接的是文件系统的类型,-o表示文件系统的类型(ro只读|rw读写),device要挂载的设备,dir表示挂载点



Previous     Next
zhing /
Published under (CC) BY-NC-SA in categories linux  tagged with linux