• shell script


    一 什么是shell script

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

    二 变量

    part1 为何要有变量

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

    part2 变量命名规则

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

    最好遵循下述规范:

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

    part3 系统变量

    set 和 env区别
    set:显示所有变量
    env:显示所有环境变量,环境变量变量名都是大写字母

    part4 变量赋值

    VARNAME=VALUE
    echo $VARNAME
    删除变量 unset VARNAME

    part5 常用系统变量

    PATH
    PWD:记录当前路径
    LANG
    HOME:当前登录用户的家目录
    HISTSIZE:设定记录的历史命令行数
    PS1:设定命令提示符的形式
    IFS
    域分隔符 是空格,换行,TAB键的合集

    part6 全局变量与局部变量

    用户自定义的变量分为局部变量和全局变量

    [root@MiWiFi-R3-srv ~]# gender='male' #在爹这个位置定义一个局部变量gender
    [root@MiWiFi-R3-srv ~]# export money=1000 #在爹这个位置定义一个全局变量money
    [root@MiWiFi-R3-srv ~]#
    [root@MiWiFi-R3-srv ~]#
    [root@MiWiFi-R3-srv ~]# bash #切换到子bash
    [root@MiWiFi-R3-srv ~]# echo $gender #在儿子这里看它爹的局部变量gender,结果为空->看不到

    [root@MiWiFi-R3-srv ~]# echo $money #在儿子这里看它爹的全局变量money,可以看到
    1000
    [root@MiWiFi-R3-srv ~]#
    [root@MiWiFi-R3-srv ~]# export hobby='piao' #在儿子这里定义一个全局变量hobby
    [root@MiWiFi-R3-srv ~]# exit #退出,进入爹的bash环境
    exit
    [root@MiWiFi-R3-srv ~]# echo $hobby #爹是看不到儿子的export的,儿子的儿子可以看到

    [root@MiWiFi-R3-srv ~]#

    part6 定义变量名的边界

    [root@MiWiFi-R3-srv ~]# rest_mem=20
    [root@MiWiFi-R3-srv ~]# echo ${rest_mem}%
    20%

    part 7 数据类型

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

    三 运算符

    part1 算术运算符

    +

    -

    *

    /

    %

    [root@MiWiFi-R3-srv ~]# echo $[3+1]
    4

    part2 关系操作

    与(())连用,(())里不需要用取值符号

    <

    >

    <=

    >=

    ==

    !=

    &&

    ||

    test命令相关,[]可以达到一样的效果
    [root@MiWiFi-R3-srv ~]# x=1
    [root@MiWiFi-R3-srv ~]# [ $x -gt 1 ]
    [root@MiWiFi-R3-srv ~]# echo $?
    0

    part3 赋值运算符

    =

    +=

    *=

    /=

    %=

    [root@MiWiFi-R3-srv ~]# x=10
    [root@MiWiFi-R3-srv ~]# ((x%3))
    [root@MiWiFi-R3-srv ~]# echo $x
    10
    [root@MiWiFi-R3-srv ~]#
    [root@MiWiFi-R3-srv ~]# ((x%=3))
    [root@MiWiFi-R3-srv ~]# echo $x
    1

    part4 shell里的所有计算器
    $[] (()) $(()) expr bc bc -l

    [root@myworld ~]# expr 1 + 2
    3

    浮点运算:yum install bc -y

    [root@MiWiFi-R3-srv ~]# echo 'scale=2;1/3'|bc -l
    .33

    用浮点数表示内存的使用率:

    [root@myworld ~]# free
                  total        used        free      shared  buff/cache   available
    Mem:         999696      268152      378804        7444      352740      548900
    Swap:       2097148           0     2097148
    [root@myworld ~]# mem_use=`free | awk 'NR==2{print $6}'`
    [root@myworld ~]# mem_total=`free | awk 'NR==2{print $2}'`

    [root@myworld ~]# x=`echo "scale=2;$mem_use/$mem_total"|bc -l | cut -d. -f2`
    [root@myworld ~]# echo ${x}%
    38%

    part5 测试操作

    命令执行后会返回到一个系统变量中 $?
    如果$?值为0 表示命令执行成功 否则为失败


    测试命令 test [ ] [[ ]] (( ))
    打开man test 逐一介绍每个参数
    part5-1、测试文件状态
    -d 目录
    -s 文件长度 > 0、非空
    -f 正规文件
    -w 可写

    -r 可读

    -x 可执行

    -L 符号连接

    -u 文件有 suid 位设置

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

    [root@MiWiFi-R3-srv ~]# var1='abc'
    [root@MiWiFi-R3-srv ~]# var2='123'
    [root@MiWiFi-R3-srv ~]# [ $var1 == $var2 ]
    [root@MiWiFi-R3-srv ~]# echo $?
    1

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

    [root@MiWiFi-R3-srv ~]# [ 10000 -gt 250 ] #不要使用大于号小于号等于号等,要使用man test中规定的,详见下一小节4拓展
    [root@MiWiFi-R3-srv ~]# echo $?
    0

    part5-4、拓展测试符号 [[ ]] (())
    数字测试符号
    # [ 10 < 2 ] # 语法错误
    -bash: 2: 没有那个文件或目录
    #

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

    字符测试
    # [ "aa" = "aa" ]
    # echo $?
    0
    # [[ "aa" = "aa" ]]
    # echo $?
    0
    # (( "aa" = "aa" )) #结果错误
    # echo $?
    1
    混合测试
    # [ 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 ~]#
    结论:
    比较数字,使用(( ))
    其他测试使用 [[ ]]
    包含数字比较的混合测试,使用[[ expr1 && expr2 ]] (( expr1 || expr2 ))

    两个文件的比较
    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

  • 相关阅读:
    Java 图片处理——如何生成高清晰度而占有磁盘小的缩略图
    【设计模式】状态模式
    【设计模式】策略模式
    【设计模式】迭代器模式
    【设计模式】观察者模式
    【设计模式】享元模式
    【设计模式】桥接模式
    【设计模式】组合模式
    【设计模式】外观模式
    【设计模式】代理模式
  • 原文地址:https://www.cnblogs.com/Icarus1900/p/7699676.html
Copyright © 2020-2023  润新知