• 脚本命令与笔记


    格式要求:首行shebang机制
    #!/bin/bash     首行必写。
    脚本代码开头约定
    1、第一行一般为调用使用的语言
    2、程序名,避免更改文件名为无法找到正确的文件
    3、版本号
    4、更改后的时间
    5、作者相关信息
    6、该程序的作用,及注意事项
    7、最后是各版本的更新简要说明

    脚本的基本结构
    #!SHEBANG
    CONFIGURATION_VARIABLES
    FUNCTION_DEFINITIONS
    MAIN_CODE

    简单脚本:
    #!/bin/bash
    # ------------------------------------------
    # Filename: hello.sh
    # Revision: 1.1
    # Date: 2017/06/01
    # Author: wang
    # Email: wang@gmail.com
    # Website: www.magedu.com
    # Description: This is the first script
    # ------------------------------------------
    # Copyright: 2017 wang
    # License: GPL
    echo “hello world”

    怎么查看脚本:
    .加文件

    chmod +x    给文件加一个执行权限。

    reset.sh   脚本,作业

    把脚本放到PASH 变量里面就不用加目录显示脚本了。

    bash -n 查看语法有没有错误。

    bash -x 跟踪命令脚本,一条执行一条查看,可以更清楚的查看脚本的运行。

    unset 加变量,等于删除了变量
    养成好习惯,用到变量就加变量,用不到时就删除。

    变量赋值的时候可以定义一段话不过查看的时候要加双引号
    echo "变量值(name)"

    变量声明、赋值:
    export name=
    declare -x name=

    bash内建的环境变量:
    PATH
     SHELL
    USER
    UID
    HOME
     PWD
     SHLVL   是查看当前在第几层。
     LANG
     MAIL
     HOSTNAME
     HISTSIZE





    只读变量:只能声明,但不能修改和删除
    声明只读变量:
    readonly name     声明变量变常量,无法更改
    declare -r name       
     查看只读变量:
    readonly –p
    位置变量:在脚本代码中调用通过命令行传递给脚本的参数
    $1, $2, ...:对应第1、第2等参数,shift [n]换位置
    $0: 命令本身
    $*: 传递给脚本的所有参数,全部参数合为一个字符串
    $@: 传递给脚本的所有参数,每个参数为独立字符串
    $#: 传递给脚本的参数的个数
    $@ $* 只在被双引号包起来的时候才会有差异
    set -- 清空所有位置变量

    scp backup11.sh wang@172.18.1.124:    把文件发给老师地址
    scp -r wang@172.18.1.124: /home/wang/scripts  /app

    作业
    1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小

    echo "The hostname :    `hostname`
    The IPv4 :      `ifconfig ens37 | egrep -o '([0-9]{1,3}.){3}[0-9{1,3}]' | head -1`
    The sysversion: `cat /etc/centos-release`
    The kernel:     `uname -r`
    The cpumod:     `lscpu | grep 'Model name:' | tr -s ' ' | cut -d: -f2`
    The mem:        `free -h | grep 'Mem:' | tr -s ' ' : | cut -d: -f2`
    The disk:   `df -h | grep '/dev/sd' | tr -s ' ' '/' | cut -d'/' -f3,4`
    "


    2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中
    cp -a /etc /root/etc/`date +%F`

    3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
    [root@entos74 ~]#The max-used disk is : `df  |grep "/dev/sd" |grep -o "<[0-9]{1,3}%" | sort -nr | head -1`
    /root/bin 下 disk11.sh

    4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
    echo "Active Internet connections:
        num    adress
    `ss -nt | grep ESTAB | tr -s ' ' : | cut -d: -f6 | sort | uniq -c | sort -nr`"



    5、编写脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
    echo $[`head -n20 /etc/passwd | tail -1 |cut -d: -f3`+`head /etc/passwd | tail -1 |cut -d: -f3`]
    6、编写脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和

    File1_spaceline=`cat $1 | grep "^[[:space:]]*$" | wc -l`
    File2_spaceline=`cat $2 | grep "^[[:space:]]*$" | wc -l`
    echo "sumid_spaceline=$[ File1_spaceline + File2_spaceline ]"

    7、编写脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件
    filenum_dir1=`ls $1 | wc -l`
    filenum_dir2=`ls $2 | wc -l`
    filenum_dir3=`ls $3 | wc -l`
    filenum_all_dir=$[ filenum_dir1 + filenum_dir2 + filenum_dir3 ]
    echo "The all file and dir number is : $filenum_all_dir"


    echo $?    是查看这个脚本运行之后成功还是错了,但是 他只是查看最后一条命令成功还是失败了。 返回值最大只是255.


    判断脚本对错
    filename=f1.sh ; [["$filename" =~ .sh$ ]]   && echo true ||echo false



    -gt  是大于
    -lt 是小于
    -eq   是等于

      [ -n "$1" ] ||  { echo -e "The arg must one Usage:createuser.sh username" && exit 20;  }      查看$1是否为空,为空就执行接下来的命令,不为空就不执行下面的命令。

    -v   查看变量有没有悲使用被赋值,如果被引用赋值就正确输出。
    var=""; [ -v var ] && echo true || echo false

    ! 取反

    -n 检测变量是否为空。

    红色字体是网络文件。


    脚本中别名不可用。

    updatedb     更新数据库

    存在性测试
    -a FILE:同-e
    -e FILE: 文件存在性测试,存在为真,否则为假
     存在性及类别测试
    -b FILE:是否存在且为块设备文件
    -c FILE:是否存在且为字符设备文件
    -d FILE:是否存在且为目录文件
    -f FILE:是否存在且为普通文件
    -h FILE -L FILE:存在且为符号链接文件
    -p FILE:是否存在且为命名管道文件
    -S FILE:是否存在且为套接字文件

    文件权限测试:
    -r FILE:是否存在且可读
    -w FILE: 是否存在且可写
    -x FILE: 是否存在且可执行
    文件特殊权限测试:
    -u FILE:是否存在且拥有suid权限
    -g FILE:是否存在且拥有sgid权限
    -k FILE:是否存在且拥有sticky权限

    文件大小测试:
    -s FILE: 是否存在且非空
     文件是否打开:
    -t fd: fd 文件描述符是否在某终端已经打开
    -N FILE:文件自从上一次被读取之后是否被修改过
    -O FILE:当前有效用户是否为文件属主
    -G FILE:当前有效用户是否为文件属组

    组合

    第一种方式:
    COMMAND1 && COMMAND2 并且
    COMMAND1 || COMMAND2 或者
    ! COMMAND
    如:[[ -r FILE ]] && [[ -w FILE ]]
     第二种方式:
    EXPRESSION1 -a EXPRESSION2 并且
    EXPRESSION1 -o EXPRESSION2 或者
    ! EXPRESSION
    必须使用测试命令进行

    使用read来把输入值分配给一个或多个shell变量
    -p 指定要显示的提示
    -s 静默输入,一般用于密码
    -n N 指定输入的字符长度N
    -d ‘字符输入结束符
    -t N TIMEOUTN
    read 从标准输入中读取值,给每个单词分配一个变量
    所有剩余单词都被分配给最后一个变量
    read -p “Enter a filename: “ FILE

    反斜线()会使随后的字符按原意解释  ,如果不加入()反斜线的话,系统认为是变量、
    $ echo Your cost: $5.00


    交互式登录   su -

    非交互式登录   su

    profile类:为交互式登录的shell提供配置
    全局:/etc/profile, /etc/profile.d/*.sh
    个人:~/.bash_profile
    功用:
    (1) 用于定义环境变量
    (2) 运行命令或脚本

    bashrc类:为非交互式和交互式登录的shell提供配置
    全局:/etc/bashrc
    个人:~/.bashrc
    功用:
    (1) 定义命令别名和函数
    (2) 定义本地变量

    修改profilebashrc文件后需生效
    两种方法:
    1重新启动shell进程
    2 . source
    :
    . ~/.bashrc

  • 相关阅读:
    WIN8 下 Hyper-V和Vmware Workstation
    小技巧总结
    工具软件
    php开发入门
    docker的用法总结
    [工具] 同步本地文件夹与VPS中的文件夹
    读书笔记之《The Art of Readable Code》Part 3
    读书笔记之《The Art of Readable Code》Part 2
    正则表达式小试牛刀
    读书笔记之《The Art of Readable Code》part 1
  • 原文地址:https://www.cnblogs.com/lmf1110/p/7900384.html
Copyright © 2020-2023  润新知