Linux基础_马哥课堂笔记08_SHELL脚本编程基础

讲师_@王晓春本章内容▼编程基础▼shell脚本基础▷创建shell脚本▷脚本的基本结构▷变量1.Shell中变量命名法则:2.bash中变量的种类局部变量环境变量位置变量退出状态3.算术运算赋值逻辑运算短路运算条件测试4.test命令bash的数值测试bash的文件测试组合测试条件5.使用read命令来接受输入6.条件选择if语句7.条件判断:case语句8.bash如何展开命令行▼bash的配...

Linux基础_马哥课堂笔记08_SHELL脚本编程基础

讲师_@王晓春

摘要:

  • 编程基础
  • 脚本基本格式
  • 变量
  • 运算
  • 条件测试
  • 条件判断if
  • 条件判断case
  • 配置用户环境
▼编程基础
  • 程序
算法
数据结构
  • 程序编程风格:
以指令为中心,数据服务于指令
以数据为中心,指令服务于数据
过程式
对象式
  • shell程序:提供了编程能力,解释执行

  • 程序的执行方式
    在这里插入图片描述

  • 编程基本概念

  • 编程逻辑处理方式:
循环执行
选择执行
顺序执行
  • shell编程:过程式、解释执行
    编程语言的基本结构:
    各种系统命令的组合
    数据存储:变量、数组
    表达式:ab
    语句:if
▼shell脚本基础
  • shell脚本通常以shebang起始
  • #!/bin/bash

    只有第一行可以使用shebang

    #!/bin/bash#!/usr/bin/python#!/usr/bin/perl
    • shell脚本的用途有:
  • 自动化常用命令
  • 执行系统管理和故障排除
  • 创建简单的应用程序
  • 处理文本或文件
  • ▷创建shell脚本

    1. 使用文本编辑器来创建文本文件

    • 第一行必须包括shell声明序列:#!
      示例:#!/bin/bash
    • 添加注释:注释以#开头

    2. 运行脚本

    • 给予执行权限,在命令行上指定脚本的绝对或相对路径
    • 直接运行解释器,将脚本作为解释器程序的参数运行

    脚本规范

  • 第一行一般为调用使用的语言
  • 程序名,避免更改文件名为无法找到正确的文件
  • 版本号
  • 更改后的时间
  • 作者相关信息
  • 该程序的作用,及注意事项
  • 最后是各版本的更新简要说明
  • ▷脚本的基本结构
    #!SHEBANGCONFIGURATION_VARIABLESFUNCTION_DEFINITIONSMAIN_CODE

    shell脚本示例

    #!/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”
    • 脚本调试

    检测脚本中的语法错误
    bash -n /path/to/some_script
    调试执行
    bash -x /path/to/some_script

    ▷变量

    在这里插入图片描述

    • 静态编译语言:使用变量前,先声明变量类型,之后类型不能改变,在编译时检查,如:java,c
    • 动态编译语言:不用事先声明,可随时改变类型,如bash,Python
    • 强类型语言:不同类型数据操作,必须经过强制转换才同一类型才能运算,如java , c# ,python
    • 弱类型语言:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用
    1. Shell中变量命名法则:

    1、不能使程序中的保留字:例如if, for
    2、只能使用数字、字母及下划线,且不能以数字开头
    3、见名知义
    4、统一命名规则:驼峰命名法

    • Shell中命名建议规则:
      1、变量名大写
      2、局部变量小写
      3、函数名小写
      4、用英文名字,并体现出实际作用
    2. bash中变量的种类

    根据变量的生效范围等标准划分下面变量类型

    • 局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
    • 环境变量:生效范围为当前shell进程及其子进程
    • 本地变量:生效范围为当前shell进程中某代码片断,通常指函数
    • 位置变量:$1, $2, …来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
    • 特殊变量:$?, $0, $*, $@, $#,$$

    $BASHPID:当前进程的PID
    $PPID:父进程的PID

    只读变量:declare -r VAR 或 readonly VAR

    局部变量

    在这里插入图片描述

    • 变量引用:${name} 或者 $name
      " "弱引用,其中的变量引用会被替换为变量值
      ' '强引用,其中的变量引用不会被替换为变量值,而保持原字符串
    • 显示已定义的所有变量:set
    • 删除变量:unset name
    环境变量

    在这里插入图片描述

    bash内建的环境变量
    $PATH$_ 上一条命令的最后一条参数$HISTSIZE
    $SHELL$HOSTNAME$MAIL
    $USER$LANG$SHLVL bash嵌套深度
    $UID$PWD$HOME
    位置变量

    在这里插入图片描述

    • set -- 清空所有位置变量
    退出状态
    • 进程使用退出状态来报告成功或失败
      0 代表成功,1-255代表失败
      $? 变量保存最近的命令退出状态

    • 退出状态码

    • bash自定义退出状态码

    • exit [n]:自定义退出状态码
      注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
      注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

    3. 算术运算

    在这里插入图片描述

    赋值

    在这里插入图片描述

    逻辑运算

    在这里插入图片描述

    • 与:11得1,有0得0
    • 或:00得0,有1得1
    短路运算

    在这里插入图片描述

    条件测试

    在这里插入图片描述
    在这里插入图片描述

    • 真与假或
    • 命令为真时:直接找&&后的命令
    • 命令为假时:直接找||后的命令
    • 例如:
    grep -q no_such_user /etc/passwd \|| echo 'No such user'No such userping -c1 -W2 station1 &> /dev/null \> && echo "station1 is up" \> || (echo 'station1 is unreachable'; exit 1)station1 is up
    4. test命令
    • 长格式的例子:
    test "$A" = "$B" && echo "Strings are equal"test “$A” -eq “$B” && echo "Integers are equal"
    • 简写格式的例子:
    [ "$A" = "$B" ] && echo "Strings are equal"[ "$A" -eq "$B" ] && echo "Integers are equal"
    bash的数值测试

    -v VAR 变量VAR是否设置
    例:[ -v x ] && echo 1 || echo 0

    数值测试字符串测试
    -gt是否大于=是否等于
    -ge是否大于等于>ascii码是否大于ascii码
    -eq是否等于<是否小于
    -ne是否不等于!=是否不等于
    -lt是否小于=~左侧字符串是否能够被右侧的PATTERN所匹配
    -le是否小于等于↑注意: 此表达式一般用于[[ ]]中;扩展的正则表达式
    -z "STRING“字符串是否为空,空为真,不空为假
    -n "STRING“字符串是否不空,不空为真,空为假

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

    bash的文件测试存在性文件权限文件大小测试
    -a FILE同-e-r FILE是否可读-t fdfd 文件描述符是否在某终端已经打开
    -e FILE文件是否存在-w FILE是否可写-N FILE文件自从上一次被读取之后是否被修改过
    -x FILE是否可执行-O FILE当前有效用户是否为文件属主
    类别文件特殊权限-G FILE当前有效用户是否为文件属组
    -d FILE是否目录-u FILE是否有SUID权限FILE1 -ef FILE2FILE1是否是FILE2的硬链接
    -f FILE是否普通文件-g FILE是否有SGID权限FILE1 -nt FILE2FILE1是否新于FILE2(mtime)
    -h FILE 或 -L FILE是否符号链接文件-k FILE是否有STICKY权限FILE1 -ot FILE2FILE1是否旧于FILE2
    -b FILE是否块设备文件
    -c FILE是否字符文件-s FILE是否存在且非空
    -p FILE是否管道文件
    -S FILE是否套接字文件
    组合测试条件
  • 第一种方式:
    COMMAND1 && COMMAND2 并且
    COMMAND1 || COMMAND2 或者
    ! COMMAND 非
  • 如:
    [ -f “KaTeX parse error: Expected 'EOF', got '&' at position 9: FILE” ] &̲& [[ “FILE”=~ .*.sh$ ]]

  • 第二种方式:
    EXPRESSION1 -a EXPRESSION2 并且
    EXPRESSION1 -o EXPRESSION2 或者
    ! EXPRESSION
    必须使用测试命令进行,[[ ]] 不支持
  • 示例:
    [ -z “$HOSTNAME” -o $HOSTNAME "==“localhost.localdomain” ]
    && hostname www.magedu.com
    [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

    5. 使用read命令来接受输入
    • 使用read来把输入值分配给一个或多个shell变量

    -p 指定要显示的提示
    -s 静默输入,一般用于密码
    -n N 指定输入的字符长度N
    -d ‘字符’ 输入结束符
    -t N TIMEOUT为N秒

    • read 从标准输入中读取值,给每个单词分配一个变量
    • 所有剩余单词都被分配给最后一个变量
      read -p “Enter a filename: “ FILE
    6. 条件选择 if 语句

    在这里插入图片描述

    #单分支if 判断条件then条件为真的分支代码else条件为假的分支代码fi#多分支if 判断条件1then条件1为真的分支代码elif 判断条件2then条件2为真的分支代码elif 判断条件3then条件3为真的分支代码else以上条件都为假的分支代码fi
    • 逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
      If示例
    根据命令的退出状态来执行命令if ping -c1 -W2 station1 &> /dev/null; thenecho 'Station1 is UP' elif grep "station1" ~/maintenance.txt &> /dev/null; thenecho 'Station1 is undergoing maintenance‘elseecho 'Station1 is unexpectedly DOWN!'exit 1fi
    7. 条件判断:case语句

    在这里插入图片描述

    case 变量引用 inPAT1)分支1;;PAT2)分支2;;...*)默认分支;;esac
    • case支持glob风格的通配符:
      *: 任意长度任意字符
      ?: 任意单个字符
      [ ]:指定范围内的任意单个字符
      a|b: a或b
    8. bash如何展开命令行
  • 把命令行分成单个命令词
  • 展开别名
  • 展开大括号的声明({})
  • 展开波浪符声明(~)
  • 命令替换$() 和 ``)
  • 再次把命令行分成命令词
  • 展开文件通配(*、?、[abc]等等)
  • 准备I/0重导向(<、>)
  • 运行命令
    • 防止扩展
      反斜线(\)会使随后的字符按原意解释
    $ echo Your cost: \$5.00Your cost: $5.00
    • 加引号来防止扩展
      •单引号(’)防止所有扩展
      •双引号(”)也防止所有扩展,但是以下情况例外:
      $(美元符号) - 变量扩展
      ` (反引号) - 命令替换
      \(反斜线) - 禁止单个字符扩展
      !(叹号) - 历史命令替换
    ▼bash的配置文件

    按生效范围划分,存在两类:

    • 全局配置:
      /etc/profile
      /etc/profile.d/*.sh
      /etc/bashrc
    • 个人配置:
      ~/.bash_profile
      ~/.bashrc
    • shell登录两种方式

    交互式登录:
    (1)直接通过终端输入账号密码登录
    (2)使用“su - UserName” 切换的用户
    执行顺序:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

    非交互式登录:
    (1)su UserName
    (2)图形界面下打开的终端
    (3)执行脚本
    (4)任何其它的bash实例
    执行顺序: /etc/profile.d/*.sh --> /etc/bashrc -->~/.bashrc

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

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

    ▷编辑配置文件生效
    • 修改profile和bashrc文件后需生效
      两种方法:
      1重新启动shell进程
      2 .或source

    例:
    . ~/.bashrc

    1. Bash 退出任务
    • 保存在~/.bash_logout文件中(用户)
    • 在退出登录shell时运行
    • 用于
      •创建自动备份
      •清除临时文件
    2. $- 变量

    h:hashall,打开这个选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set h将h选项关闭
    i:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,在脚本中,i选项是关闭的。
    m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等。
    B:braceexpand,大括号扩展
    H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的一个历史命令,“!n”返回第 n 个历史命令

    set 命令
    • $- 变量
      h:hashall,打开这个选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set h将h选项关闭
      i:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,在脚本中,i选项是关闭的。
      m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等。
      B:braceexpand,大括号扩展
      H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的一个历史命令,“!n”返回第 n 个历史命令

    重要

    • set -u 在扩展一个没有设置的变量时,显示错误信息(等同set –o nounset)
    • set -e 如果一个命令返回一个非0退出状态值(失败)就退出(等同set –o errexit)
    练习

    1、编写脚本per.sh,判断当前用户对指定参数文件,是否不可读并且不可写
    2、编写脚本excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件
    3、编写脚本nologin.sh和login.sh,实现禁止和允许普通用户登录系统
    4、编写脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
    5、编写脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
    6、编写脚本/root/bin/checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
    Bash的文件测试
    7、编写脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
    8、编写脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
    9、编写脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件
    10、编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息
    11、编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
    12、编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)
    13、编写脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数
    14、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
    15、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中
    16、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
    17、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
    18、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin
    19、用户root登录时,将命令指示符变成红色,并自动启用如下别名: rm=‘rm –i’
    cdnet=‘cd /etc/sysconfig/network-scripts/’
    editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eth0’
    editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 或 ifcfg-ens33 ’ (如果系统是CentOS7)
    20、任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous!”
    21、编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等
    22、编写用户的环境初始化脚本reset.sh,包括别名,登录提示符,vim的设置,环境变量等

    练习答案

    1、编写脚本per.sh,判断当前用户对指定参数文件,是否不可读并且不可写

    #!/bin/bashif [ -e $1 ]then[  ! -r $1 -a! -w $1  ] && echo "The file is not write and not red" || echo "The file can read or write"else echo "The file isn't exist"fi

    2、编写脚本excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件

    #!/bin/bash[ -f $1 -a $(echo $1 | grep ".*\.sh") ] && chmod 755 $1;echo "yesyes" || echo " isn't a script"

    3、编写脚本nologin.sh和login.sh,实现禁止和允许普通用户登录系统

    #!/bin/bashloginyes=nonenologin=none[ -f /etc/nologin ] && read -n 1 -p "Do you want to allow user login[Y/N]:" nologin || read -n 1 -p "Do you want to forbid user login[Y/N]: " loginyesloginyes=$(echo $loginyes | tr 'A-Z' 'a-z')nologin=$(echo $nologin | tr 'A-Z' 'a-z')#echo -e "your choose is $loginyes \n please wait! \n ... \n Done,all of users was forbid to login."#echo "your choose is $nologin \n please wait! \n ... \n Done,all of users was allowed to login."if [ $loginyes = 'y' ]then  echo -e "\nyou choose yeyesyess"  touch /etc/nologinelif [ $loginyes = 'n' ]then  echo -e "\nyou choose NO"fiif [ $nologin = 'y' ]then  echo -e "\n you choose yes"  rm -f /etc/nologinelif [ $nologin = 'n' ]then  echo -e "\nyou choose No"fi

    4、编写脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数

    #!/bin/bash[ $# -lt 1 ] && echo "you must give me unless one agrument"&&exit 1  || echo `cat $1| grep ^$|wc -l`

    5、编写脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

    #!/bin/bash#ping ipping -c 1 $1 > /dev/nul[ $? -eq 0 ] && echo "ip can ping" || echo " ip can't ping"

    6、编写脚本/root/bin/checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
    Bash的文件测试

    #!/bin/bash#test6 disk user%USES=$(df | egrep -o "[0-9]{1,3}%" | tr -d %| sort -nr|head -1)USEI=$(df -i | egrep -o "[0-9]{1,3}%" | tr -d %| sort -nr|head -1)[ $USES -ge 80 ] && wall "WARNING! the disk for almost"[ $USEI -ge 80 ] && wall "WARNING! the inode for almost"

    7、编写脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和

    #!/bin/bashUSER10=$(cat /etc/passwd | head -10 | tail -1|cut -d: -f3)USER20=$(cat /etc/passwd | head -20 | tail -1|cut -d: -f3)SUMUSER=$[ $USER10$USER20 ]echo "ID sum is $SUMUSER"

    8、编写脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和

    #!/bin/bash[ $# -lt 1 ] && echo "please input unless one argument" && exit#SUM1=$(cat $1 | grep ^$|wc -l)#SUM2=$(cat $2 | grep ^$|wc -l)#SUM=$[ $SUM1$SUM2 ]sum=$( cat $@ | grep "^$" | wc -l )echo "the space sum is $sum"

    9、编写脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件

    #!/bin/bashETC=$( ls -dl /etc/* /var/* /usr/*| wc -l)echo "/etc and /var and /usr have $ETC directories or file"

    10、编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息

    #!/bin/bash#10.createuser[ $# -lt 1 ] && echo "plead input unless one argument" && exit 1useradd $1 &> /dev/nulUSER_EXIT=$?[ $USER_EXIT  -eq 9 ] && echo "createuser.sh: user $1 already exists" && exit 9[ ! $USER_EXIT -eq 0 ] && echo "createuser.sh: ERROR"id $1

    11、编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息

    #!/bin/bashread -p "Please input [Yes/No]:" YESORNOcase $YESORNO in[Yy][Ee][Ss]|[Yy])echo "you choose yesyes";;[Nn][Oo]|[Nn])echo "you choose no";;*)echo "you choose other"esac

    12、编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)

    #!/bin/bash[ $# -lt 1 ] && echo "Please input unless one argument!" && exitfor count in `seq 1 $#`doCHAR=$(eval ls -dl \$$count | cut -c 1)CO="\e[1;32m"LOR="\e[0m"case $CHAR in-)  echo -e "The file type is \e[1;32mnormal file\e[0m"  ;;l)  echo -e "The file type is $CO link file $LOR"  ;;d)  echo -e "The file type is $CO directory $LOR"  ;;*)  echo "sorry,I still don't know the file type "esacdone

    13、编写脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数

    #!/bin/bash[ $# -lt 1 ] && echo "Please intput unless one argument" && exit[ $# -gt 1 ] && echo "I just can understand one argument" && exit[[ $1 =~ ^[0-9]*$ ]] && echo "your argument is a positive integer" || echo "your argument isn't a INT"

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

    #!/bin/bashCO="\e[1;31m"LOR="\e[0m"echo -e "The hostname is $CO `hostname` $LOR"echo -e "The IP address is $CO `ifconfig ens33| egrep -o "(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){3}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>"` $LOR"echo -e "The kernel release $CO `uname -r` $LOR"echo -e "The System version is $CO `cat /proc/version | grep -o ".*64"` $LOR"echo -e "The CPU model is $CO `lscpu | grep "Model name"|cut -d: -f2 |tr -d " " ` $LOR"echo -e "The memory is $CO `lsmem | grep "Total online memory"|cut -d: -f2|tr -d " "` $LOR"echo -e "The disk is $CO `lsblk | grep "\<sda\>"|tr -s ' '| cut -d ' ' -f4` $LOR"

    15、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中

    #!/bin/bashcp -a /etc/ /root/etc`date %F`

    16、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值

    #!/bin/bashecho -e "The disk use ratio is `df | grep -o "...%"|tr -d %|sort -nr|head -1`%"

    17、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序

    #!/bin/bash#links.shecho  "you host links stat is :"who | egrep -o "(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){3}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>"|uniq -c|sort -nr

    18、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin

    vim /etc/profile.d/env.shexport PATH=/usr/local/apache/bin:$PATHsource /etc/profile.d/env.sh

    19、用户root登录时,将命令指示符变成红色,并自动启用如下别名:

    vim /root/.bashrc...PS1='\[\e[1;31m\][\u@\h \w]\$\[\e[0m\]'rm=‘rm –i’cdnet=‘cd /etc/sysconfig/network-scripts/’editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-ens33’ ...

    20、任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous!”

    #任意用户登录系统时,会按如下读取配置,在如下哪个文件写都可以 #/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrcvim /etc/profile.d/env.shecho -e '\033[31m hi,dangerous! \033[0m'

    21、编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等
    示例

    vim ~/.vimrcset nu "show lineset ts=4 "TAB 4 charssyntax on "grammar lightset cursorline"set mouse=aset aiautocmd BufNewFile *.sh exec ":call SetTitle()"func SetTitle()  if expand("%:e") == 'sh'  call setline(1,"#!/bin/bash")  call setline(2,"#")  call setline(3,"#***********************************************************")  call setline(4,"#Author: Jibill Chen")  call setline(5,"#QQ:  *********")  call setline(6,"#Date:".strftime("%Y-%m-%d"))  call setline(7,"#FileName: ".expand("%"))  call setline(8,"#URL: http://thson.blog.csdn.net")  call setline(9,"#Description: The test script")  call setline(10,"#**********************************************************")  call setline(11,"")  endifendfuncautocmd BufNewFile * normal G

    22、编写用户的环境初始化脚本reset.sh,包括别名,登录提示符,vim的设置,环境变量等

    vim reset.sh...cat >> ~/.bash_profile << EOFPS1='\[\e[1;8;$[RANDOM%6 41]m\][\u@\h \w]\$\[\e[0m\]'export REGEX_IP='(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])'EOF#config bashrccat >> ~/.bashrc << EOFalias cdnet='cd /etc/sysconfig/network-scripts/'EOF#config vimrccat >> ~/.vimrc << EOFset nu "show lineset ts=4 "TAB 4 charssyntax on "grammar lightset cursorline"set mouse=aset aiautocmd BufNewFile *.sh exec ":call SetTitle()"func SetTitle()  if expand("%:e") == 'sh' call setline(1,"#!/bin/bash") call setline(2,"#") call setline(3,"#***********************************************************") call setline(4,"#Author: Jibill Chen") call setline(5,"#QQ:  **********") call setline(6,"#Date:".strftime("%Y-%m-%d")) call setline(7,"#FileName: ".expand("%")) call setline(8,"#URL: http://thson.blog.csdn.net") call setline(9,"#Description: The test script") call setline(10,"#**********************************************************") call setline(11,"")endifendfuncautocmd BufNewFile * normal GEOF...
    源文地址:https://www.guoxiongfei.cn/csdn/4858.html