美文网首页
Shell学习记录

Shell学习记录

作者: Jorvi | 来源:发表于2018-07-27 15:24 被阅读0次

    1. Hello World

    #!/bin/bash
    echo "Hello World !"
    

    运行:

    • cd 到该目录下
    • chmod +x ./test.sh 给脚本权限
    • ./test.sh 执行脚本

    2. Shell变量

    定义:变量名不加美元符号($)

    • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
    • 中间不能有空格,可以使用下划线(_)。
    • 不能使用标点符号。
    • 不能使用bash里的关键字(可用help命令查看保留关键字)。
    # 注意=两边不能有空格
    a="aaa"
    

    使用:在变量名前面加美元符号($)即可使用

    # 两种方法
    echo $a
    echo ${a}
    

    只读变量

    # 将变量a定义为只读变量,只读变量不能改变
    readonly a
    

    删除变量

    # 只读变量无法删除
    unset b
    

    字符串

    # 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
    # 单引号字串中不能出现单引号(对单引号使用转义符后也不行)
    str='this is a string'
    
    # 双引号里可以有变量
    # 双引号里可以出现转义字符
    str2="hello, ${a}"
    

    3. Shell参数传递

    在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。

    #!/bin/bash
    echo "执行的文件名:$0";
    echo "第一个参数为:$1";
    

    4. Shell数组

    #!/bin/bash
    
    # 定义数组
    my_array=(A B "C" D)
    
    # 按下标取值
    echo "第一个元素为: ${my_array[0]}"
    echo "第二个元素为: ${my_array[1]}"
    
    # 数组中所有元素
    echo "数组的元素为: ${my_array[*]}"
    echo "数组的元素为: ${my_array[@]}"
    
    # 数组长度
    echo "数组元素个数为: ${#my_array[*]}"
    echo "数组元素个数为: ${#my_array[@]}"
    

    5. Shell运算

    算数运算

    • 运算符左右必须有空格
    • 完整的表达式要被反引号(``)包含
    #!/bin/bash
    
    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
    

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

    #!/bin/bash
    
    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
    

    布尔运算

    #!/bin/bash
    
    a=10
    b=20
    
    # 与运算
    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
    

    逻辑运算

    #!/bin/bash
    
    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
    

    字符串运算

    #!/bin/bash
    
    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
    

    文件检测运算

    #!/bin/bash
    
    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
    

    6. Shell显示

    echo命令

    #!/bin/sh
    
    # 从标准输入中读取一行,并赋给变量a
    read a
    # 输出变量a
    echo "$a"
    
    # -e 开启转义
    echo -e "OK! \n GO" 
    
    # 结果定向到文件
    echo "It is a test" > myfile
    
    # 输出执行结果(当前时间)
    echo `date`
    

    printf命令

    #!/bin/bash
    
    # 输出 1 abc
    printf "%d %s\n" 1 "abc"
    

    7. test命令

    test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

    # [] 执行基本的算数运算
    num1=$[2*3]
    num2=$[1+5]
    if test $[num1] -eq $[num2]; then
        echo '两个数字相等!'
    else
        echo '两个数字不相等!'
    fi
    

    8. 流程控制

    if else

    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
    

    for循环

    for loop in 1 2 3 4 5
    do
        echo "The value is: $loop"
    done
    

    while循环

    echo '按下 <CTRL-D> 退出'
    echo -n '输入: '
    while read a
    do
        echo "$FILM"
    done
    

    跳出循环
    break:直接跳出循环体
    continue:不跳出循环体,结束当前循环,继续下一次循环

    case判断
    取值将检测匹配的每一个选项。一旦匹配上,则执行完匹配选项相应命令后不再继续其他选项。如果无一选项匹配,使用星号 * 捕获该值。

    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
    

    9. 函数

    有返回值

    #!/bin/bash
    
    funWithReturn(){
        echo "这个函数会对输入的两个数字进行相加运算..."
        echo "输入第一个数字: "
        read aNum
        echo "输入第二个数字: "
        read anotherNum
        echo "两个数字分别为 $aNum 和 $anotherNum !"
        return $(($aNum+$anotherNum))
    }
    
    # 先定义,后使用
    funWithReturn
    # 调用函数后,通过 $? 来获得该函数返回值
    echo "输入的两个数字之和为 $?"
    

    有参数

    #!/bin/bash
    
    funWithParam(){
        echo "第一个参数为 $1"
        echo "第二个参数为 $2"
        
        # 当n>=10时,需要使用${n}来获取参数。
        echo "第十个参数为 ${10}"
        echo "第十一个参数为 ${11}"
        echo "参数总数有 $# 个"
        echo "作为一个字符串输出所有参数 $* "
    }
    funWithParam 1 2 3 4 5 6 7 8 9 34 73
    

    10. 重定向

    输出重定向

    # 结果写入文件,控制台不显示(覆盖方式)
    echo "aaa" > file
    
    # 结果写入文件,控制台不显示(追加方式)
    echo "aaa" >> file
    
    # 控制台不显示,内容也不写入文件
    echo "aaa" > /dev/null
    

    输入重定向

    # 从文件读取输入
    echo input < file
    

    11. 文件包含

    将a.sh加入b.sh中,即可在b.sh中使用a.sh中的内容

    # 方法一
    # 注意点号(.)和文件名中间有一空格
    . filename  
    
    # 方法二
    source filename
    

    12. 调试shell脚本

    sh -x test.sh
    

    相关文章

      网友评论

          本文标题:Shell学习记录

          本文链接:https://www.haomeiwen.com/subject/smkimftx.html