zoukankan      html  css  js  c++  java
  • linux基础: shell----awk、 和shell script 的变量、运算符、if多分支 ----基本语法

    一 什么是shell script :

      将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令 就是脚本了.
      再加上些智能(条件/流控)控制,就变成了智能化脚本了.

    二 变量:

      

    1 为何要有变量

        程序的运行就是一些列状态的变值值的变化去表示

    2 变量命名规则

         以字母或下划线开头,剩下的部分可以是:字母、数字、下划线.

         最好遵循下述规范:

        1.以字母开头
        2.使用中划线或者下划线做单词的连接
        3.同类型的用数字区分
        4.对于文件最好加上拓展名

        5.见名之意,

       例如: sql_money.tar.gz,log_age.tar.bz2 

    3 系统变量

       set 和 env区别
       set:显示所有变量
       env:环境变量

    4 变量赋值

       如:money = 10

            age = 20
            echo $money
            删除变量 unset age

    5 数据类型

    bash中的变量无须声明,拿来就用.默认的变量都会是字符类型,还可以有数字类型,普通的脚本,这两种类型够用了

    三 运算符

      算术运算符:

        1  加  +

        2  减  -

        3  乘  *

        4  除  /

     逻辑运算符:

        1  大于  >

        2  小于  <

        3  等于  ==

        4  不等于 !=

        5  大于等于  >=

        6  小于等于  <=

    赋值运算符 :

       1  =

       2  +=

       3  -=

       4  *=

       5  /=

       6 %=

       例如: a = 1

                 a = a + 1   简写为: a += a

                  其他的都是一样的意思

    1 测试文件状态


           -d 目录

           -s 文件长度 > 0、非空
           -f 正规文件
           -w 可写

           -r 可读

           -x 可执行

            -L 符号连接

            -u 文件有 suid 位设置

    2、字符串测试
            = 两个字符串相等
           != 两个字符串不相等
            -z 空串
            -n 非空串

    3、测试数值
        -eq 等于
        -ne 不等于
        -gt 大于
         -lt 小于
         -ge 大于等于
         -le 小于等于

    [root@MiWiFi-R3-srv ~]# [ 10000 -gt 250 ] #不要使用大于号小于号等于号等,要使用man test中规定的

    4、拓展测试符号 [[ ]] (())


        4.1 数字测试符号


           # [ 10 < 2 ] # 语法错误
           -bash: 2: 没有那个文件或目录
           # 

           # [[ 2 > 10 ]] # 结果错误
           # echo $?
           0
           # [[ 20 > 10 ]] # 正确
           # echo $?
           0
           # (( 10 < 20 ))
           # echo $?
           0

       4.2 字符测试


           # [ "aa" = "aa" ]
           # echo $?
           0
           # [[ "aa" = "aa" ]]
           # echo $?
           0
           # (( "aa" = "aa" )) #结果错误
           # echo $?
           1


      4.3 混合测试


           # [ a = a -a 10 < 20 ]
           -bash: 20: 没有那个文件或目录
           [root@seker ~]# [[ a = a -a 10 < 20 ]]
           bash: syntax error in conditional expression
           -bash: syntax error near `-a'
           [root@seker ~]# [[ a = a && 10 < 20 ]]
           [root@seker ~]# echo $?
           0
           [root@seker ~]# [[ a = a || 10 < 20 ]]
           [root@seker ~]# echo $?
           0
           [root@seker ~]# (( a = a || 10 < 20 ))
           [root@seker ~]# echo $?
           0
           [root@seker ~]# (( a = a && 10 < 20 ))
           [root@seker ~]# echo $?
           0
           [root@seker ~]# 
      结论: 
          1.1  比较数字,使用(( ))
                 其他测试使用 [[ ]]
                 包含数字比较的混合测试,使用[[ expr1 && expr2 ]] (( expr1 || expr2 ))

          1.2  两个文件的比较
                 FILE1 -ef FILE2
                 测试两个文件是否是相同的inode
                 有时为了找到同一个INODE号的文件 更倾向于使用 find 命令的 -inum 或 --samefile

                  FILE1 -nt FILE2
                  FILE1 is newer (modification date) than FILE2

                  FILE1 -ot FILE2
                  FILE1 is older than FILE2

    四 流程控制

    1分支结构

     
    #!/bin/bash
    var='/etc/init.d'
    #var='/dev/sda'
    if [ -d $var ]
        then
            echo "$var is directory"
    elif [ -b $var ]
        then
            echo "$var is block"
    elif [ -f $var ]
        then
            echo "$var is regular file"
    else
            echo 'unknow'
    fi
    复制代码

    if 测试中还可以执行命令 根据命令的返回值做判断
    # if cd / ;then echo Y ;fi
    # if grep -q root /etc/passwd ;then echo Y ;fi

    向脚本传递参数

     
    #test.sh
    echo $0
    echo $1
    echo $2
    echo $3
    echo ${11}
    echo '$$' $$
    echo '$*' $*
    echo '$@' $@
    echo '$#' $#
    echo '$?' $?
    
    '''
    测试:python test.sh 1 2 3 4 5 6 7 8 9 10 11
    输出结果:
    ./test.sh
    1
    2
    3
    11
    $$ 14312
    $* 1 2 3 4 5 6 7 8 9 10 11
    $@ 1 2 3 4 5 6 7 8 9 10 11
    $# 11
    $? 0
    '''
     

    修改脚本,使其能接收调用者传来的参数

     
    [root@MiWiFi-R3-srv ~]# cat test_file.sh 
    #!/bin/bash
    if [ -d $1 ]
        then
            echo "$1 is directory"
    elif [ -b $1 ]
        then
            echo "$1 is block"
    elif [ -f $1 ]
        then
            echo "$1 is regular file"
    else
            echo 'unknown'
    fi
    [root@MiWiFi-R3-srv ~]# ./test_file.sh /etc/passwd
    /etc/passwd is regular file

                 

    只有 一个判断条件为单分支

      当判断条件多余一个时,则为多分支

  • 相关阅读:
    无重复字符的最长子串
    有效的括号
    最长公共前缀
    罗马数字转整数
    Android解析JSON数据异步加载新闻图片
    回文数
    Java从Json获得数据的四种方式
    JavaMD5加密工具类
    div模仿select效果二:带搜索框
    BG雪碧图制作要求
  • 原文地址:https://www.cnblogs.com/gaoyuan111/p/6604761.html
Copyright © 2011-2022 走看看