• shell 脚本基础


      shell的一些特殊符号,特殊用法
      echo {1..10} //代表的是 1 2 3 4 5 6 7 8 9 10
      echo {1..10..2} //代表的是 1 3 5 7 9 步长为2 
      echo {a..z} 
      echo {a,b,c} //输出了 a,b,c
      '' 单引号 意义 是什么就是什么 很直
      "" 双引号 只能识别变量 命令不认识
      `` 反引号 当做命令执行 什么都认识 一个命令会调用另外一个命令的执行结果的时候 与$() 一样的效果,运行命令的结果

       0  代表成功,1-255代表失败  $? 变量保存最近的命令退出状态

    弱类型语言 

      a=1
      echo $a
      -----------------------------------------------------------------------
      [root@localhost ~]$ NAME=he
      [root@localhost ~]$ TITLE=ceo
      [root@localhost ~]$ echo $NAME is $TITLE
      he is ceo
      [root@localhost ~]$ echo $NAME is $TITLE -b
      he is ceo -b
      [root@localhost ~]$ echo $NAMExiaofei is $TITLE -b
      is ceo -b
      [root@localhost ~]$ echo ${NAME}xiaofei is $TITLE -b
      hexiaofei is ceo -b
      

      name="ni sadsal jdsial"

        值中没有空格的话,可以不用加引号,如果有空格的话,就要加上引号,否则报错


      systeminfo.sh
      CMD=hostname
      $CMD //直接输出这个变量,相当于运行变量中保存的命令

     --------------------------------------------------------------------------------------------------------------

    shell 脚本格式 shebang格式
      第一行 #!/usr/bash #!shell类型

    运行 无执行权限 bash hello.sh   有执行权限,直接输入脚本的路径就可以执行。source 也可以执行脚本,但是source是在当前的进程中去运行的,可以改变当前的环境。所以source多用来配置文件的生效,而bash 运行脚本,是在开启一个子shell下运行的。运行结束子进程的shell也就会结束,不会影响当前的环境

    执行过程:本质就是我们写的Linux命令,一行写一个,然后逐行去运行。一般的默认错误或者正确的输出都会输出(除了中断的问题)。在脚本中也可以使用“;” ,一条命令写多行就用 分开

    当脚本出现错误时,分为两种 

      1语法错误,遇到这种错误,shell就不会往下执行了,就会退出了,之前的还是会执行,因为是一行一行的执行的

      2逻辑错误,这种情况只是逻辑错误而已,不会全部退出,还是会一行一行往下执行的。

      3脚本的运行是在一个子shell中运行的。
    检查语法 bash -n user.sh 跟踪每一行的执行结果bash -x user.sh
    变量用完之后,记得删 unset name1 name2

      一般我们在shell里定义的变量,只能存在当前shell,不同的终端登录,不同的shell进程(父子shell进程),这些都是独立的shell进程。访问不到其他shell中的变量
      export NAME //设置环境变量 ,环境变量可以多个shell都可以访问到,只能从上往下传,不能从下往上传。上面创建的环境变量,下面可以访问到,也可以修改值。再往下传的话,就是修改过后的值,但是上面的bash还是原来的值,也就是只能对下面有效。
        env 列出当前全部的环境变量

      (umask 066;touch f1) //内部产生了一个子shell   只对()内的命令有效,虽然()会开启一个子进程去运行,但是这个子进程还能访问到父进程的一些变量(不是环境变量的变量),所以这个很特殊。其他的子shell都获取不了父进程的变量。

       {  } 相当于代码段,作为一个整体了。而且花括号里面的命令,结尾都要加;。包括最后一个

    ===================================================================================

    bash中的算术运算

    算数 var=$[算术表达式] 算数表达式中 变量的引用不能加""
    [root@localhost ~]$ a=1
    [root@localhost ~]$ b=2
    [root@localhost ~]$ c=$[a+b]
    [root@localhost ~]$ echo $c
    3
    [root@localhost ~]$ echo $[$a+$b]
    3
    [root@localhost ~]$ echo $[20+$b]
    22

    生成 0 - 49 之间随机数   echo $[$RANDOM%50] 

    ===================================================================================

    条件判断

    与或 计算 短路与 短路或 在Linux shell 中 0 代表成功,1-255代表失败 1为真 0为假
      命令1 && 命令1的结果为真 运行这里 || 命令1的结果为假 则运行这里

    注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命 令后面的数字

        命令1 && 命令1的结果为真 运行这里 || 命令1的结果为假 则运行这里
    判断表达式(注意 变量都加上引号 "$a")   

    1. test EXPRESSION
    2. ?[ EXPRESSION ]
    3. ?[[ EXPRESSION ]]

      数值的比较判断: [ EXPRESSION ] 

    -gt 是否大于 

    -ge 是否大于等于 

    -eq 是否等于 

    -ne 是否不等于 

    -lt 是否小于 

    -le 是否小于等于

    [ $USE -ge 80 -o $USE_I -ge 80 ]    -o 或者   -a 并且

    字符串 的比较

    = 是否等于 

    > ascii码是否大于ascii码 

    < 是否小于 

    != 是否不等于 

    =~ 左侧字符串是否能够被右侧的PATTERN所匹配    注意: 此表达式一般用于[[  ]]中;  扩展的正则表达式 

     -z "STRING“ 字符串是否为空,空为真,不空为假   

    -n "STRING“ 字符串是否不空,不空为真,空为假,不用加-n 效果也是一样的

     注意:用于字符串比较时的用到的操作数都应该使用引号

     文件的比较

    -e FILE: 文件存在性测试,存在为真,否则为假 

     -b FILE:是否存在且为块设备文件 

    -c FILE:是否存在且为字符设备文件 

    -d FILE:是否存在且为目录文件 

    -f FILE:是否存在且为普通文件

    -r FILE:是否存在且可读 

    -w FILE: 是否存在且可写 

    -x FILE: 是否存在且可执行

      多个条件的组合判断

    第一种。只适合[]:
    EXPRESSION1 -a EXPRESSION2 并且
    EXPRESSION1 -o EXPRESSION2 或者
    ! EXPRESSION
    第二种
    file=/date/test.sh;[[ $file =~ .sh$ ]] && [ -x "$file" ] && $file

    位置变量
    $1, $2, ... 对应第1、第2等参数,shift [n]换位置 
    $0 命令本身的路径 
    $* 传递给脚本的所有参数,全部参数合为一个字符串 
    $@ 传递给脚本的所有参数,每个参数为独立字符串 
    $# 传递给脚本的参数的个数

    if 条件语句

      单分支

        

      双分支

         

     if 也可以用命令退出状态做判断

    if ping -c1 -W2 station1 &> /dev/null; then

            echo 'Station1 is UP'

    elif  grep "station1" ~/maintenance.txt &> /dev/null;  then

            echo 'Station1 is undergoing maintenance'

    else 

          echo 'Station1 is unexpectedly DOWN!' 

           exit 1   

    fi 

        写成单行的话: if [ "$PS1" ]; then echo test is ok; fi

     写成分开的话:   

    if [ "PS1" ]
    > then echo "test is ok"
    > fi
    test is ok
     case判断

    case 变量引用 in

    PAT1)

        分支1

        ;;

    PAT2)

        分支2

        ;;

    ...

    *)

        默认分支

        ;;

    esac 

     case支持glob风格的通配符: 

    • *: 任意长度任意字符 
    • ?: 任意单个字符 
    • []:指定范围内的任意单个字符 
    • a|b: a或b 

            

    read
    [root@localhost ~]# read NAME AGE 自动忽略空格
    hxf 20
    [root@localhost ~]# echo $NAME $AGE
    hxf 20

      

    脚本安全
        在最前面加上
        set -u 当使用了没有声明的变量时,就会报错。避免使用没有声明的变量而产生空置的逻辑问题。
        set -e 当某一条命令运行错误时,那就退出,不允许下面的命令了。如果不加,默认的脚本是,某一条命令出现问题,下面的命令还会运行。

    要有多努力才能对得起奔波的脚步和身上的期望
  • 相关阅读:
    Qt/Qml 电子书阅读器
    Qt/Qml 翻页特效
    vue如何引入本地js(不被打包编译的js)文件
    CSS3解决移动端手指点击或滑动屏幕时出现的浅蓝色背景框
    vue移动端touch插件
    vue组件间通信六种方式(完整版)
    Vue 过渡实现轮播图
    vue中遇到的坑 --- 变化检测问题(数组相关)
    Vue判断设备是移动端还是pc端
    vue项目如何监听窗口变化,达到页面自适应?
  • 原文地址:https://www.cnblogs.com/hxfcodelife/p/12009939.html
Copyright © 2020-2023  润新知