• shell脚本语法学习


    以下内容仅为个人学习使用,如有错误,欢迎指出

    持续更新...............

    一.首先创建.sh文件,打开并在文件的第一行输入#!/bin/sh

    执行shell文件命令为:

    . filename.sh

    source filename.sh

    二.常用命令

    1.echo命令,变量

    第二次变量赋值时,不用加$号,只有使用时才加

    test='我是变量'
    echo "$test"
    或者
    echo $test

    #如果这种情况使用变量,只需要在变量外加{}号
    echo "it's num $testtest"
    #改为
    echo "it's num ${test}test"

    #只读变量
    var="variable"
    readonly

    #删除变量
    unset var_name

    #注意:只读变量是不可修改和删除的

    #获取字符串长度
    echo ${#var}
    #截取字符串
    echo ${var:1:3}


    #定义数组格式
    array_name=(value0 value1 value2 value3)

    #读取数组格式
    valuen=${array_name[n]}

    #读取数组长度,或者@变成*
    length=${#array_name[@]}

    #echo显示换行可以使用
    echo -e "it is"
    #显示结果到文件
    echo "It is a test" > myfile
     

    2.注释

    #单行注释
    
    # -------------------------
    
    
    :<<EOF
    多行注释
    多行注释
    多行注释
    多行注释
    EOF
    
     或
    
    :<<'
    多行注释
    多行注释
    多行注释
    '
    
    又或者
    
    :<<!
    多行注释
    多行注释
    多行注释
    !

    3.read命令

    用来读取用户在控制台上输入的内容

    echo "please input you content"
    #这里content自定义,就是一个变量名
    read content echo "you input content is $content"

    三.参数传递(函数调用的参数调用)

    1.

    #!/bin/sh
      
    echo "共有$#个参数"
    echo "第一个参数为:$1"
    echo "第二个参数为:$2"
    echo "所有参数:$*"
    echo "脚本运行的当前进程id号为:$$"
    if [ $? == 0 ]
    then
    
            echo "当前程序没有错误"
    else
            echo "程序发生错误"
    fi

    结果为:

    当程序没有发生错误时,$?就会返回0

    msw@bogon:~/Desktop$ . fun.sh 2 5
    共有2个参数
    第一个参数为:2
    第二个参数为:5
    所有参数:2 5
    脚本运行的当前进程id号为:92957
    当前程序没有错误

    2.特殊字符处理参数:

    参数处理说明
    $# 传递到脚本的参数个数
    $* 以一个单字符串显示所有向脚本传递的参数
    $$ 脚本运行的当前进程ID号
    $! 后台运行的最后一个进程的ID号
    $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
    $- 显示Shell使用的当前选项,与set命令功能相同。
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

    四.数组

    #!/bin/sh
    
    #可以这样定义数组
    new_array=('a' 2 'c' 4)
    echo "The first element is ${new_array[0]}"
    echo "Second element is ${new_array[1]}"
    #获取数组的所有元素
    echo "all element ${new_array[*]}"
    echo "all element ${new_array[@]}"
    #获取数组的长度
    echo "element count is ${#new_array[*]}"
    
    # 也可以这样
    two_array[0]=0
    two_array[1]='b'
    echo "The first element is ${two_array[0]}"
    echo "Second element is ${two_array[1]}"

    结果为:

    The first element is a
    Second element is 2
    all element a 2 c 4
    all element a 2 c 4
    element count is 4
    The first element is 0
    Second element is b

    五.循环大法 

    #!/bin/sh
    
    new_array=('a' 2 'c' 4)
    
    # for 循环
    echo "-----for cycle----"
    for i in ${new_array[*]};
    do
            echo $i
    done
    
    #while 循环
    
    echo "-----while cycle----"
    n=0
    while [ $n -lt ${#new_array[@]} ]
    do
            echo ${new_array[$n]}
         # let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式
            let n++
    done

    结果为:

    -----for cycle----
    a
    2
    c
    4
    
    -----while cycle----
    a
    2
    c
    4

    六.运算符

    1.

    #!/bin/sh

    a=8 b=5 echo "加 : `expr $a + $b `" echo "减 : `expr $a - $b `" echo "乘 : `expr $a * $b `" echo "除 : `expr $a / $b `" echo "取余 : `expr $a % $b `" if [ $a == $b ] then echo "a==b" fi if [ $a != $b ] then echo "a!=b" fi

    结果为:

    加 : 13
    减 : 3
    乘 : 40
    除 : 1
    取余 : 3
    a!=b

    注意条件表达式的两边一定要留空格,否则会将运算表达式直接输出

    msw@bogon:~/Desktop$ expr 1+2
    1+2
    msw@bogon:~/Desktop$ expr 1 + 2
    3

    这只是算数运算符,还有

    2.关系运算符:

    运算符说明举例
    -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。

    3.布尔运算符:

    运算符说明举例
    ! 非运算,表达式为 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。

    4.逻辑运算符:

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

    5.字符串运算符:

    运算符说明举例
    = 检测两个字符串是否相等,相等返回 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。

    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。

    注意:使用 [[ ... ]] 条件判断结构,而不是 [ ... ],能够防止脚本中的许多逻辑错误。比如,&&||< 和 > 操作符能够正常存在于 [[ ]] 条件判断结构中,但是如果出现在 [ ] 结构中的话,会报错。

    用法就不一一介绍了

    七.流程控制

    上面和下面都用过了,此处就不在举例了

    1.if...elif...else:格式如下

    if condition1
    then
        command1
    elif condition2
    then
        command2
    else
        commandN
    fi

    2.for 循环:格式如下

    for var in item1 item2 ... itemN
    do
        command1
        command2
        ...
        commandN
    done

    3.死循环:或while true

    while :
    do
        command
    done

    4.until循环:与while循环刚好相反,until 循环执行一系列命令直至条件为 true 时停止。

    until condition
    do
        command
    done

    例:循环输出n,直到n大于5

    #!/bin/sh
    
    n=0
    until [ $n -gt 5 ]
    do
            echo $n
            let n++
    done

    结果为:

    0
    1
    2
    3
    4
    5

    5.case:Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

    case 值 in
    模式1)
        command1
        command2
        ...
        commandN
        ;;
    模式2)
        command1
        command2
        ...
        commandN
        ;;
    esac

    例:

    #!/bin/sh
    
    echo "input you name first letter"
    read name
    case $name in
    'm')
            echo "you is msw"
            ;;
    'w')
            echo "you is wbd"
            ;;
    *)
            echo "i don't know you"
            ;;
    esac

    结果为:

    msw@bogon:~/Desktop$ . case.sh
    input you name first letter
    m
    you is msw
    msw@bogon:~/Desktop$ . case.sh
    input you name first letter
    w
    you is wbd
    msw@bogon:~/Desktop$ . case.sh
    input you name first letter
    r
    i don't know you

    6.还有break和continue流程控制语句

    n=0
    while :
    if [ $n == 3 ]
    then
            let n++
            continue
    fi
    do
            echo $n
            let n++
    if [ $n == 5 ]
    then
            break
    fi
    done

    结果为:

    0
    1
    2
    4

    到这里流程控制就差不多了

    八.shell函数

    1.

    #!/bin/sh
    
    #建立函数
    
    new_function(){
            echo "input one number"
            read numone
            echo "input one number again"
            read numtwo
            return $(($numone+$numtwo))
    }
    
    
    #调用函数
    new_function
    #使用$?来获取函数的返回值
    echo "you input two sum is $?"

    结果为:

    input one number
    1
    input one number again
    2
    you input two sum is 3

    2.函数的参数调用

    #!/bin/sh
    
    new_fontion(){
            echo "第一个参数为:$1"
            echo "第二个参数为:$2"
            echo "第三个参数为:$3"
    }
    
    new_function 1 4 2

    结果为:

    1
    4
    2

    九.持续更新中.....

    先上两小段代码吧

    # 执行系统命令语法: `系统命令`
    ip=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'` #ip1=/sbin/ifconfig|sed -n '/inet addr/s/^[^:]*:\([0-9.]\{7,15\}\) .*/\1/p' | grep -v 127.0.0.1 while True; do echo "$ip" ipp=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'` echo "$ipp" if [ "$ip" != "$ipp" ]; then `sudo shutdown -h 16:00` else echo "正常" fi sleep 1s done

    这段代码主要是监控ip地址是否发生改变,如果IP地址改变则执行关机

    #!/bin/sh
      
    echo "please input you name"
    read name
    echo "please input one number:"
    read numbero
    echo "please input one number again:"
    read numbert
    if [[ x$name == 'x' || x$numbero == 'x' || x$numbert == 'x' ]]
    then
            echo "you input has null"
    elif [[ $numbero -gt $numbert && $name == 'msw' ]]
    then
            echo "you input one big"
    elif [ $numbero -lt $numbert ]
    then
            echo "you input two big"
    else
            echo "ne"
    fi

    这段代码没什么意思,主要是联系我见天学习的几个命令和判断语法

    重难点详解

    x$name == 'x' 判断输入是否为空,还可以写成

    [ -n $name ] :长度不为0则真

    [ -z $name ] :   长度为0为真

    注意:在[[]]中才可使用&& ||语法,如果是[],和是-a, 或是-o

      还有要注意字段间的空格

    今天就先到这里吧!

  • 相关阅读:
    2020-2021第一学期2024"DCDD"小组第十二周讨论
    2020-2021第一学期《网络空间安全导论》第十二周自习总结
    2020-2021第一学期2024"DCDD"小组第十一周讨论
    2020-2021第一学期《网络空间安全导论》第十一周自习总结
    2020-2021第一学期2024"DCDD"小组第十周讨论
    2019-2020-1 20165213 20165224 20165311 《信息安全系统设计基础》实验五 通讯协议设计
    2019-2020-1 实验三 并发程序
    2019-2020-1 20165213 20165224 20165311 实验二
    2019-2020-1 20165213 20165224 20165311 实验一 开发环境的熟悉
    20165213 Exp9 Web安全基础
  • 原文地址:https://www.cnblogs.com/mswei/p/9965456.html
Copyright © 2020-2023  润新知