• shell脚本笔记


    编辑脚本

    vim  /home/dmtsai/test.sh 

    编写shell规范:
    1,声明解释器 #!/bin/bash
    2,脚本功能注释, #此脚本的作用、使用场所、作者等
    3,脚本内容,要执行的指令

    脚本的执行方式:
    1,添加x权限
    2,使用bash之类的解释器读取脚本文件,比如bash test.sh 或者sh test.sh,新开启子进程(解释器)
    3,使用source命令读取脚本文件,比如source test
    source可以省略为 . 不开启子进程(解释器)

    cat /etc/shells //显示系统所有解释器
    vim /etc/profile //修改HISTSIZE决定能保存的历史命令数量,修改HISTSIZE=10决定能保存的历史命令数量
    >  .bash_history     //清空历史记录文件

    变量

    什么是变量?以不变的名称存放的可能会变化的值

    变量名=变量值

    注意:等号两边不要有空格;
    变量名仅由字母/数字/下划线组成,区分大小写;
    变量名不能以数字开头,不要使用关键字和特殊字符;
    若指定的变量名已存在,相当于为此变量重新赋值;

    1.自定义变量,使用大小写字母,数字,下划线,不能以数字开头,不能使用特殊符号

    引用变量: $变量名
    查看变量:echo $变量名、echo ${变量名}

    2.环境变量,变量名大写,由系统定义并且赋值完成,直接使用

    PWD   当前位置

    USER 当前用户名

    HOSTNAME   主机名

    SHELL    当前用户的解释器

    HOME    当前用户的家目录

    UID   当前用户的UID号

    PATH   系统命令所在地

    PS1    一级提示符

    PS2    二级提示符

    3.位置变量:在执行脚本时提供的命令行参数,表示为: $n,n为序号

    4.预定义变量

    $*  显示所有位置变量的值
    $#  统计位置变量的个数
    $$  当前程序的进程号
    $?  上一条指令的执行结果,0是正确,非0是异常

    简单脚本技巧

    单引号 ' ' -->用来界定范围,可以取消所有特殊字符的意义
    双引号 " "   -->用来界定范围
    反撇号 ` `或者  $()   --> 将命令的输出结果,直接参与另一条命令的运行

    [root@queen ~]# date +%F
    2020-06-16
    [root@queen ~]# mkdir /opt/mydir-`date +%F`
    [root@queen ~]# ls /opt/
    mydir-2020-06-16
    [root@queen ~]# mkdir /opt/nsd-$(date  +%F)
    [root@queen ~]# ls /opt/
    mydir-2020-06-16  nsd-2020-06-16
    [root@queen ~]# mkdir /opt/$(hostname)-$(date +%F)
    [root@queen ~]# ls /opt/
    mydir-2020-06-16  nsd-2020-06-16  queen-2020-06-16

    重定向输出
     >: 只收集前面命令的正确输出

     2>: 只收集前面命令的错误输出

     &>使用变量:收集前面命令的正确与错误输出

    /dev/null:黑洞设备,专用于收集不要的输出信息

    高级用法:

    命令标准输出错误输出
    >/dev/null 2>&1 丢弃 丢弃
    2>&1 >/dev/null 丢弃 屏幕
    [root@server0 ~]$ vim /root/user.sh
     #!/bin/bash
     read  -p  '请输入您要创建的用户名:'    abc
     read  -p  '请输入您要设置的密码:'    nsd
     useradd  $abc &> /dev/null
     echo  用户$abc创建成功
     echo  $nsd  |  passwd  --stdin  $abc &> /dev/null
     echo  用户$abc密码设置成功
    [root@server0 ~]$ sh /root/user.sh
    请输入您要创建的用户名:

    read  -p   '屏幕输出信息'     #产生交互,必须要加上单引号,记录用户的输入信息

    条件测试与选择

    检查文件状态常用测试选项:

    -e   文件名        #文档存在为真
    -d   文件名        #文档存在且必须目录,才为真
    -f    文件名        #文档存在且必须文件,才为真
    -r    文件名        #文档存在且必须对其有读取权限,才为真
    -w   文件名       #文档存在且必须对其有写入权限,才为真
    -x   文件名        #文档存在且必须对其有执行权限,才为真

    两个档案之间的比较:

           -nt(newer than)    #判断file1 是否比file2 新
           -ot(older than)     #判断file1 是否比file2 旧
           -ef          #判断file1 与file2 是否为同一档案,可用在判断hard link 的判定上。主要意义在判定,两个档案是否均指向同一个inode

    多重条件判定:

    -a      #两状况同时成立!and
    -o      #两状况任何一个成立!or
    !       #反向条件

    A任务 && B任务       A任务执行成功才执行B任务
    A任务 || B任务          A任务执行失败才执行B任务

    字符串判断:

    -z 字符串        #判定字串是否为空 ?若string 为空字串,则为true
    -n 字符串       #判定字串是否不为空 ?若string不为空字串,则为真。 -n亦可省略
    字符串1 == 字符串      # 判定str1 是否等于str2 ,若相等,则为真
    字符串 != 字符串          #判定str1 是否不等于str2 ,若不相等,则为真

    [root@server0 ~]$ [    $USER   ==     root     ]
    [root@server0 ~]$ echo $?
    0
    [root@server0 ~]$ [    new    !=       old    ]
    [root@server0 ~]$ echo $?
    0
    #在中括号[] 内的每个元件都需要有空白键来分隔;
    #在中括号内的变数,最好都以双引号括号起来;
    #在中括号内的常数,最好都以单或双引号括号起来。

     比较整数大小:

    -gt      #大于
    -ge     #大于等于
    -eq    #等于
    -ne   #不等于
    -lt      #小于
    -le     #小于等于

    if分支语句:

    #单分支
    if  条件测试;then
        命令序列
    fi
    #双分支
    if  条件测试;then
        命令序列
    else
        命令序列2
    fi
    #多分支
    if  条件测试;then
        命令序列
    elif 条件测试;then
        命令序列2
    else
        命令序列3
    fi

    case 分支 ,作用与if类似:

    case 变量 in
    模式1)
        命令序列1 ;;
    模式2)
        命令序列2 ;;
    模式3)
        命令序列3 ;;
    *)
        命令序列4
    esac

    函数,可以简化脚本

    #格式
    function  函数名 () {
         命令序列
    }             

    实例:

    [root@queen ~]# vim test1.sh
    #!/bin/bash
    function printit(){
            echo -n "Your choice is "      #加上-n可以不断行继续在同一行显示
    }
    
    echo "This program will print your selection !"
    case ${1} in
      "one")
            printit ; echo ${1} | tr 'az' 'AZ'   #将参数做大小写转换!
            ;;
      "two")
            printit ; echo ${1} | tr 'az' 'A-Z'
            ;;
      "three")
            printit ; echo ${1} | tr 'az' 'A-Z'
            ;;
      *)
            echo "Usage ${0} {one|two|three}"
            ;;
    esac
    [root@queen ~]# sh test1.sh one
    This program will print your selection !
    Your choice is one

    循环:

    for 变量名 in 变量值1  值2 。。。
    do
        命令序列
    done
    #格式
    whiledo
        命令序列
    done

    break 退出循环,继续执行循环之后的任务
    continue 退出当前循环,继续下一次循环
    exit 退出脚本

    脚本测试

    [dmtsai@study ~]$ sh 选项 test.sh 
    选项参数:
    -n :不要执行script,仅查询语法的问题
    -v :再执行sccript 前,先将scripts 的内容输出到屏幕
    -x :在执行时显示参数和命令

    脚本写完后赋于x权限,可以放入计划任务中

    chmod +x /opt/test2
    crontab -e
    * * * * * /opt/test2

    cron命令

     

    参考文章

  • 相关阅读:
    淡季买房注意细节 防售楼部“挂羊头卖狗肉”
    买房容易选房难 八大把关教您如何选好房
    socket发送接收字段采用Base64加密笔记
    深入理解JDK、JRE
    Socket读取JSONArray字串越界等相关问题
    android采用MediaPlayer监听EditText实现语音播报手机号码(阿拉伯数字)
    读取properties文件
    关于android客户端在线版本更新的总结(json源码)
    验证码
    base64举例
  • 原文地址:https://www.cnblogs.com/xujint/p/13140795.html
Copyright © 2020-2023  润新知