zoukankan      html  css  js  c++  java
  • Shell : 基本语法

    一 什么是shell script: 

      将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令 就是脚本了.

    再加上些智能(条件/流控)控制,就变成了智能化脚本了.

    二 变量:

    (1)为何要有变量:

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

    (2)变量命名规则:

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

    最好遵循下述规范:

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

    (3)系统变量:

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

     (4)变量赋值:

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

    (5)常用系统变量 :

    PATH
    PWD
    LANG
    HOME
    HISTSIZE
    PS1
    IFS
    域分隔符 是空格,换行,TAB键的合集

     (6)定义变量名的边界:

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

    (7)数据类型:

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

    三 运算符

    (1) 算术运算符:

    +

    -

    *

    /

    %

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

    (2) 关系操作:

    与(())连用

    <

    >

    <=

    >=

    ==

    !=

    &&

    ||

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

    (3) 赋值运算符:

    =

    +=

    *=

    /=

    %=

    [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

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

    浮点运算:yum install bc -y

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

    (5) 测试操作:

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


    测试命令 test [ ] [[ ]] (( ))
    打开man test 逐一介绍每个参数


    5-1、测试文件状态:
    -d 目录
    -s 文件长度 > 0、非空
    -f 正规文件
    -w 可写

    -r 可读

    -x 可执行

    -L 符号连接

    -u 文件有 suid 位设置

    5-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

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

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

    5-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

  • 相关阅读:
    关于RadAsm中GetEnvironmentStrings的BUG。
    GetStartupInfo 反调试
    基于TLS的反调试技术
    几种RAID级别的比较
    常用的外网yum源之epel.repo
    常用yum源之(Percona MySQL)
    swap的几点理解
    solaris系统动态查看swap的使用情况
    一次CTS引发的网络故障
    一次goldengate故障引发的操作系统hang起,HA自动切换
  • 原文地址:https://www.cnblogs.com/bsxq/p/6946873.html
Copyright © 2011-2022 走看看