zoukankan      html  css  js  c++  java
  • CentOS初步学习记录(二)Shell Script

    一、前言

    1.1 Shell

    Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

    Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

    Shell 有很多种,Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell,而目前常用的,也是 Centos 默认的 shell:Bash(Bourne Again shel)。

    1.2 Shell 脚本

    Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

    业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。

    二、权限

    2.1 Linux 中的文件有三种权限

    • r:读(read),对应数字4 
    • w:写(write),对应数字2 
    • x:执行(execute),对应数字1 

    2.2 改变文件权限

    1)用字母表示权限

    Linux 的文件调用权限分为三级 : 文件拥有者(User)、群组(Group)、其他(Other),利用 chmod 命令可以藉以控制文件如何被他人所调用,基本语法为:

    chmod [u/g/o/a][+/-/=][r/w/x/X] file
    • u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
    • + 表示增加权限,- 表示取消权限,= 表示唯一设定权限。
    • r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
    chmod a+r file1.txt  # 将文件 file1.txt 设为所有人皆可读取

    2)用数字表示权限

    此外 chmod 也可以用数字来表示权限 ,基本语法为:

    chmod abc file
    • 若要 rwx 属性则:4+2+1=7;
    • 若要 rw- 属性则:4+2=6;
    • 若要 r-x 属性则:4+1=5
    chmod 777 file1.txt   # 将文件 file1.txt 设为最高权限

    三、 流程控制

    3.1 if else

    基本语法为:

    if condition1
    then
        command1
    elif condition2 
    then 
        command2
    else
        commandN
    fi

    实例:判断两个变量是否相等:

    a=10
    b=20
    if [ $a == $b ]
    then
       echo "a 等于 b"
    elif [ $a -gt $b ]
    then
       echo "a 大于 b"
    elif [ $a -lt $b ]
    then
       echo "a 小于 b"
    else
       echo "没有符合的条件"
    fi

    3.2 case

    基本语法为:

    casein
    模式1)
        command
        ;;
    模式2)
        command
        ;;
    *)
        command
        ;;  
    esac

    实例:

    echo '输入 1 到 4 之间的数字:'
    echo '你输入的数字为:'
    read aNum
    case $aNum in
        1)  echo '你选择了 1'
        ;;
        2)  echo '你选择了 2'
        ;;
        3)  echo '你选择了 3'
        ;;
        4)  echo '你选择了 4'
        ;;
        *)  echo '你没有输入 1 到 4 之间的数字'
        ;;
    esac

    执行结果类似:

    输入 14 之间的数字:
    你输入的数字为:
    3
    你选择了 3

    四、运算符

    4.1 算数运算符

    原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

    expr 是一款表达式计算工具,使用它能完成表达式的求值操作,例如,两个数相加:

    val=`expr 2 + 2`
    echo "两数之和为 : $val"

    执行结果:

    两数之和为 : 4

    注意:

    1. 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2

    2. 获取执行结果赋值到变量的表达式需要被反单引号(` `)包含

    假设变量 a 为 10,变量 b 为 20:

    运算符说明实例
    + 加法 `expr $a + $b` 结果为 30
    - 减法 `expr $a - $b` 结果为 -10
    * 乘法 `expr $a * $b` 结果为  200
    / 除法 `expr $b / $a` 结果为 2
    % 取余 `expr $b % $a` 结果为 0
    = 赋值 a=$b 将把变量 b 的值赋给 a
    == 相等,用于比较两个数字,相同则返回 true [ $a == $b ] 返回 false
    != 不相等。用于比较两个数字,不相同则返回 true [ $a != $b ] 返回 true

    实例:

    a=10
    b=20
    
    val=`expr $a + $b`
    echo "a + b : $val"
    
    val=`expr $a - $b`
    echo "a - b : $val"
    
    val=`expr $a * $b`
    echo "a * b : $val"
    
    val=`expr $b / $a`
    echo "b / a : $val"
    
    val=`expr $b % $a`
    echo "b % a : $val"
    
    if [ $a == $b ]
    then
       echo "a 等于 b"
    fi
    if [ $a != $b ]
    then
       echo "a 不等于 b"
    fi

    执行结果:

    a + b : 30
    a - b : -10
    a * b : 200
    b / a : 2
    b % a : 0
    a 不等于 b

    注意:

    1. 乘号(*)前边必须加反斜杠()才能实现乘法运算

    2. 在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "" 

    4.2 关系运算符

    关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

    假定变量 a 为 10,变量 b 为 20:

    运算符说明实例
    -eq 检测两个数是否相等,相等返回 true [ $a -eq $b ] 返回 false
    -ne 检测两个数是否不相等,不相等返回 true [ $a -ne $b ] 返回 true
    -gt 检测左边的数是否大于右边的,如果是,则返回 true [ $a -gt $b ] 返回 false
    -lt 检测左边的数是否小于右边的,如果是,则返回 true [ $a -lt $b ] 返回 true
    -ge 检测左边的数是否大于等于右边的,如果是,则返回 true [ $a -ge $b ] 返回 false
    -le 检测左边的数是否小于等于右边的,如果是,则返回 true [ $a -le $b ] 返回 true

    实例:

    a=10
    b=20
    
    if [ $a -eq $b ]
    then
       echo "$a -eq $b : a 等于 b"
    else
       echo "$a -eq $b: a 不等于 b"
    fi
    if [ $a -ne $b ]
    then
       echo "$a -ne $b: a 不等于 b"
    else
       echo "$a -ne $b : a 等于 b"
    fi
    if [ $a -gt $b ]
    then
       echo "$a -gt $b: a 大于 b"
    else
       echo "$a -gt $b: a 不大于 b"
    fi
    if [ $a -lt $b ]
    then
       echo "$a -lt $b: a 小于 b"
    else
       echo "$a -lt $b: a 不小于 b"
    fi
    if [ $a -ge $b ]
    then
       echo "$a -ge $b: a 大于或等于 b"
    else
       echo "$a -ge $b: a 小于 b"
    fi
    if [ $a -le $b ]
    then
       echo "$a -le $b: a 小于或等于 b"
    else
       echo "$a -le $b: a 大于 b"
    fi

    执行结果:

    10 -eq 20: a 不等于 b
    10 -ne 20: a 不等于 b
    10 -gt 20: a 不大于 b
    10 -lt 20: a 小于 b
    10 -ge 20: a 小于 b
    10 -le 20: a 小于或等于 b

    4.3 布尔运算符

    假定变量 a 为 10,变量 b 为 20:

    运算符说明实例
    非运算,表达式为 true 则返回 false,否则返回 true [ ! false ] 返回 true
    -o 或运算,有一个表达式为 true 则返回 true [ $a -lt 20 -o $b -gt 100 ] 返回 true
    -a 与运算,两个表达式都为 true 才返回 true [ $a -lt 20 -a $b -gt 100 ] 返回 false
    实例:
    a=10
    b=20
    
    if [ $a != $b ]
    then
       echo "$a != $b : a 不等于 b"
    else
       echo "$a != $b: a 等于 b"
    fi
    if [ $a -lt 100 -a $b -gt 15 ]
    then
       echo "$a 小于 100 且 $b 大于 15 : 返回 true"
    else
       echo "$a 小于 100 且 $b 大于 15 : 返回 false"
    fi
    if [ $a -lt 100 -o $b -gt 100 ]
    then
       echo "$a 小于 100 或 $b 大于 100 : 返回 true"
    else
       echo "$a 小于 100 或 $b 大于 100 : 返回 false"
    fi
    if [ $a -lt 5 -o $b -gt 100 ]
    then
       echo "$a 小于 5 或 $b 大于 100 : 返回 true"
    else
       echo "$a 小于 5 或 $b 大于 100 : 返回 false"
    fi

    执行结果:

    10 != 20 : a 不等于 b
    10 小于 10020 大于 15 : 返回 true
    10 小于 10020 大于 100 : 返回 true
    10 小于 520 大于 100 : 返回 false

    4.4 逻辑运算符

    假定变量 a 为 10,变量 b 为 20:

    运算符说明实例
    && 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
    || 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

    实例:

    a=10
    b=20
    
    if [[ $a -lt 100 && $b -gt 100 ]]
    then
       echo "返回 true"
    else
       echo "返回 false"
    fi
    
    if [[ $a -lt 100 || $b -gt 100 ]]
    then
       echo "返回 true"
    else
       echo "返回 false"
    fi

    执行结果:

    返回 false
    返回 true

    4.5 字符串运算符

    假定变量 a 为 "abc",变量 b 为 "efg":

    运算符说明实例
    = 检测两个字符串是否相等,相等返回 true [ $a = $b ] 返回 false
    != 检测两个字符串是否相等,不相等返回 true [ $a != $b ] 返回 true
    -z 检测字符串长度是否为0,为0返回 true [ -z $a ] 返回 false
    -n 检测字符串长度是否为0,不为0返回 true [ -n $a ] 返回 true
    str 检测字符串是否为空,不为空返回 true [ $a ] 返回 true

    实例:

    a="abc"
    b="efg"
    
    if [ $a = $b ]
    then
       echo "$a = $b : a 等于 b"
    else
       echo "$a = $b: a 不等于 b"
    fi
    if [ $a != $b ]
    then
       echo "$a != $b : a 不等于 b"
    else
       echo "$a != $b: a 等于 b"
    fi
    if [ -z $a ]
    then
       echo "-z $a : 字符串长度为 0"
    else
       echo "-z $a : 字符串长度不为 0"
    fi
    if [ -n $a ]
    then
       echo "-n $a : 字符串长度不为 0"
    else
       echo "-n $a : 字符串长度为 0"
    fi
    if [ $a ]
    then
       echo "$a : 字符串不为空"
    else
       echo "$a : 字符串为空"
    fi

    执行结果:

    abc = efg: a 不等于 b
    abc != efg : a 不等于 b
    -z abc : 字符串长度不为 0
    -n abc : 字符串长度不为 0
    abc : 字符串不为空

    4.6 文件测试运算符

    操作符说明举例
    -b file 检测文件是否是块设备文件,如果是,则返回 true [ -b $file ] 返回 false
    -c file 检测文件是否是字符设备文件,如果是,则返回 true [ -c $file ] 返回 false
    -d file 检测文件是否是目录,如果是,则返回 true [ -d $file ] 返回 false
    -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true [ -f $file ] 返回 true
    -g file 检测文件是否设置了 SGID 位,如果是,则返回 true [ -g $file ] 返回 false
    -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true [ -k $file ] 返回 false
    -p file 检测文件是否是有名管道,如果是,则返回 true [ -p $file ] 返回 false
    -u file 检测文件是否设置了 SUID 位,如果是,则返回 true [ -u $file ] 返回 false
    -r file 检测文件是否可读,如果是,则返回 true [ -r $file ] 返回 true
    -w file 检测文件是否可写,如果是,则返回 true [ -w $file ] 返回 true
    -x file 检测文件是否可执行,如果是,则返回 true [ -x $file ] 返回 true
    -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true [ -s $file ] 返回 true
    -e file 检测文件(包括目录)是否存在,如果是,则返回 true [ -e $file ] 返回 true

    实例:变量 file 表示文件"/var/www/runoob/test.sh",它的大小为100字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:

    file="/var/www/runoob/test.sh"
    if [ -r $file ]
    then
       echo "文件可读"
    else
       echo "文件不可读"
    fi
    if [ -w $file ]
    then
       echo "文件可写"
    else
       echo "文件不可写"
    fi
    if [ -x $file ]
    then
       echo "文件可执行"
    else
       echo "文件不可执行"
    fi
    if [ -f $file ]
    then
       echo "文件为普通文件"
    else
       echo "文件为特殊文件"
    fi
    if [ -d $file ]
    then
       echo "文件是个目录"
    else
       echo "文件不是个目录"
    fi
    if [ -s $file ]
    then
       echo "文件不为空"
    else
       echo "文件为空"
    fi
    if [ -e $file ]
    then
       echo "文件存在"
    else
       echo "文件不存在"
    fi

    执行结果:

    文件可读
    文件可写
    文件可执行
    文件为普通文件
    文件不是个目录
    文件不为空
    文件存在

    五、函数

    shell 可以用户定义函数,然后在shell脚本中可以随便调用。

    1)基本语法

    [ function ] funname [()]
    {
        action;
        [return int;]
    }

    2)参数

    在 Shell 中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数……以此类推。

    注意,$10 不能获取第十个参数,获取第十个参数需要 ${10}。当 n>=10 时,需要使用 ${n} 来获取参数。

    3)返回值

    return 只能返回一个数字,仅仅代表从被调函数返回到主调函数继续执行,返回时可附带一个返回值。

    4)实例

    实例一:

    funWithReturn(){
        echo "这个函数会对输入的两个数字进行相加运算..."
        echo "输入第一个数字: "
        read aNum
        echo "输入第二个数字: "
        read anotherNum
        echo "两个数字分别为 $aNum 和 $anotherNum !"
        return $(($aNum+$anotherNum))
    }
    funWithReturn
    echo "输入的两个数字之和为 $? !"

    执行结果类似:

    这个函数会对输入的两个数字进行相加运算...
    输入第一个数字: 
    1
    输入第二个数字: 
    2
    两个数字分别为 12 !
    输入的两个数字之和为 3 !

    实例二:

    function func() 
    {
       echo "hello, txl!"
    }
    temp=$(func) # 等同于 temp=`func`
    echo $temp

    执行结果:

    hello, txl!
  • 相关阅读:
    css flex布局应用
    Java 中 List、HashTable、HashMap、TreeMap
    Java 面向对象的三大特征
    Java-冒泡排序算法
    单例模式- 实现方式
    Mac
    Appium DesiredCapabilities 参数设置
    Mac- appium 环境配置
    PHP安装+使用
    mac 安装protobuf,并编译
  • 原文地址:https://www.cnblogs.com/tangxuliang/p/9118092.html
Copyright © 2011-2022 走看看