导航:[首页]->[bash]->[Bash学习-入门]

Hello World

    #!/bin/bash

    function main()
    {
            echo "hello world"
            return 0
    }
    main "${@}"

变量

没有特殊要求,变量访问使用"${var}"(使用双引号加大括号括起来)

特殊变量
  • $# 命令行参数的个数
  • $* 所有命令行参数的内容(值为字符串)
  • $@ 所有命令行参数的内容(值为字符串数组)
  • $0 命令程序的文件名或命令的名字
  • $n 命令行的第n个参数
  • $? 上一条命令执行后的状态
  • $$ 当前shell的PID
  • $! 最后一个后台运行的命令的PID
  • $- 当前选项标志
  • $ 上一条命令的最后一个参数
局部变量

在前面加入local(函数参数总是局部变量)。见下面的两段代码 #!/bin/bash var="abc" function main() { local var="def" } main "${@}" echo "${var}" # 输出abc ################################ #!/bin/bash var="abc" function main() { var="def" } main "${@}" echo "${var}" # 输出def

比较

整数操作

使用 if [ left opr right ];then -eq (equal) -ne (not equal) -gt (great than) -lt (less then) -ge (great and equal) -le (less and equel)

字符串比较

使用 if [[ left opr right ]];then = (equal) != (not equal) > (great than) < (less then)

变量判断

使用 if [ opr var ];then -z (zero) -n (not zero)

文件判断

使用 if [ opr var ];then -e file 文件 file 已经存在 -f file 文件 file 是普通文件 -s file 文件 file 大小不为零 -d file 文件 file 是一个目录 -r file 文件 file 对当前用户可以读取 -w file 文件 file 对当前用户可以写入 -x file 文件 file 对当前用户可以执行 -g file 文件 file 的 GID 标志被设置 -u file 文件 file 的 UID 标志被设置 -O file 文件 file 是属于当前用户的 -G file 文件 file 的组 ID 和当前用户相同

if判断

  • 下面的elif可以写成else if
  • 注意"[","]"左右两边的空格
  • 若then不放在if同一行,那么";"可以省略 if [ var1 -gt var2 ];then echo "test" fi ################################# if [ var1 -gt var2 ];then echo "test" else echo "test" fi ################################# if [ var1 -gt var2 ];then echo "test" elif [ var1 -eq var2 ];then echo "test" else echo "test" fi
    与或非
      # 或
      if [ $1 -eq 1 ] || [ $1 -eq 2 ];then
              echo $1
      else
              echo "fuck"
      fi
      # 与
      if [ $1 -ge 1 ] && [ $1 -le 2 ];then
              echo $1
      else
              echo "fuck"
      fi
      # 非
      if [ ! $1 -gt 10 ];then
              echo $1
      else
              echo "fuck"
      fi
    
      # 或
      if [ $1 -eq 1 -o $1 -eq 2 ];then
              echo $1
      else
              echo "fuck"
      fi
      # 与
      if [ $1 -ge 1 -a $1 -le 2 ];then
              echo $1
      else
              echo "fuck"
      fi
    

for循环

    # 如果列表被包含在一对双引号中,则被认为是一个元素
    for var in a b c d;do
            echo -n " ${var} |"
    done
    # a | b | c | d |
    ######################################
    # 如果换成"${var}",则被认为是一个元素
    var="a b c d"
    for var in ${var};do
        echo -n " ${var} |"
    done
    # a | b | c | d |
    ######################################
    # 声明数组
    declare -a array=(a b c d)
    for var in "${array[@]}";do
        echo -n " ${var} |"
    done
    # a | b | c | d |
    ######################################
    # 枚举参数
    function main()
    {
        for var;do
            echo -n " ${var} |"
        done
    }
    main a b c d
    # a | b | c | d |
    ######################################

数组

    # 声明全局数组
    declare -a array=(a b c d)

    # 枚举数组
    for var in "${array[@]}";do
        echo -n " ${var} |"
    done

    # 打印数组长度
    echo;echo "array size : ${#array[@]}"
    # 打印第二个元素
    echo;echo "second value: ${array[1]}"

    # 销毁数组
    unset array

    function main()
    {
            # 声明局部数组
            local -a localarray=(a b c d e)
            for var in "${localarray[@]}";do
                    echo -n " ${var} |"
            done
    }
    # 打印局部数组
    main

    # 设置元素,
    # 若变量不存在,则创建之
    # 否则在该变量的基础上修改
    array[0]=v
    array[1]=w
    array[2]=x
    array[3]=z

let与expr

bash中的整数运算中常会用到let与expr # expr是一个实体命令(/usr/bin/expr),而let是一个内建命令,效率较高 a=1 echo $(expr $a + 1) # 注意这里“+”两边有空格。 # 2 echo $(expr $a+1) #“+”两边没有空格输出的结果,这一定不是我们想要的。 # 1+1

    let c=$a+1      # 注意这里“+”两边没有空格。(若有空格将导致语法错误)
    echo $c
    # 2
    let c="$a + 2"  # 其实"+"两边可以有空格的,但需要用引导把两边引起来。
    echo $c
    # 3

While

    var=0
    while [ ${var} -lt 5 ]
    do
            echo "while test"
            let var="${var} + 1"
    done
    # 输出5行"while test"

Until

理解起来很别扭 var=0 until [ ${var} -ge 5 ] do echo "aa" let var="${var} + 1" done

Case

    "*)"似乎必须靠前,否则匹配不了
    case $1 in
    1)
            echo "first"
            ;;
    [2-9])
            echo "second $1"
            ;;
    3*)
            echo "third $1"
            ;;
    4[0-9])
            echo "four $1"
            ;;
    *)
            echo "default"
            ;;
    esac

函数

    function func1
    {
        return 0
    }
    func2()
    {
        return 1
    }
    function func3()
    {
        echo "aaa"
        return 2
    }
    # 调用
    func1 "arg1" "arg2"
    # 获得返回值
    func2 "arg1" "arg2"
    ret="${?}"
    # 获得输出
    declare output
    output=`func3 "arg1" "arg2"`
同时获取输出和返回值
    function func()
    {
            echo "aaa"
            return 2
    }

    # 获得输出(错误)
    declare output=`func "arg1" "arg2"`
    ret=$?
    echo $output #aaa
    echo $ret #0

    # 获得输出
    output=`func "arg1" "arg2"`
    ret=$?
    echo $output #aaa
    echo $ret #2

    # 获得输出
    declare output
    output=`func "arg1" "arg2"`
    ret=$?
    echo $output #aaa
    echo $ret #2

参考