• 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

      还有要注意字段间的空格

    今天就先到这里吧!

  • 相关阅读:
    《C# to IL》第一章 IL入门
    multiple users to one ec2 instance setup
    Route53 health check与 Cloudwatch alarm 没法绑定
    rsync aws ec2 pem
    通过jvm 查看死锁
    wait, notify 使用清晰讲解
    for aws associate exam
    docker 容器不能联网
    本地运行aws lambda credential 配置 (missing credential config error)
    Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
  • 原文地址:https://www.cnblogs.com/mswei/p/9965456.html
Copyright © 2020-2023  润新知