shell编程

壹、脚本的环境准备

一、#!/bin/bash 解释

 #!/bin/bash
 以 #! 开头
 用于指定命令解释器
 ​
 python 脚本
 #!/bin/python3
 ​
 推荐书写脚本时务必添加,尤其是脚本后续给系统服务使用、系统调用的场景。

二、如何创建脚本的时候自动添加说明信息

 #1.修改 /etc/vimrc(红帽系统)或 /etc/vim/vimrc(ubuntu、debian 系统)
 #2.增加以下内容
 autocmd BufNewFile *.py,*.cc,*.sh,*.java,*.bash exec ":call SetTitle()"
 ​
 func SetTitle()  
     if expand("%:e") =~ 'sh\|bash'  
        call setline(1,"#!/bin/bash")
        call setline(2, "##############################################################")  
        call setline(3, "# File Name: ".expand("%"))
        call setline(4, "# Version: V1.0")
        call setline(5, "# Author: Newman")
        call setline(6, "# Organization: www.oldboyedu.com")
        call setline(7, "# Description:")
        call setline(8, "##############################################################")
        call setline(9, "")
    endif  
 endfunc
 #3.使用 vi/vim 创建以.bash 或.sh 结尾的文件(如 vim lidao.sh、vim oldboy.bash、vim sys_check.sh)。

贰、变量

变量分类说明
普通变量(局部变量)最常用,命名不能以数字开头命名最好体现出变量功能 ip=sys_ip net_ipecho ${name}避免金庸新作问题
特殊变量$? $n $0 $# $*$@判断,循环搭配使用
环境变量(全局变量)PATH,PS1,LANG,UIDUID主要用于检查是否为root

一、普通变量

 “金庸新作” 问题示例:
  name=lidao
  echo $nameoldboy
  echo ${name} oldboy

二、特殊变量

常用必会特殊变量说明应用场景
$0脚本名字错误输出时,提示用户如何使用脚本,结合判断使用
$n位置参数,命令行参数内容通过$1、$2、$… 形式传递到脚本中,实现简易交互 / 传参脚本检查常用,是命令行与脚本的桥梁
$#脚本参数个数与判断结合使用,检查参数个数
$*取出脚本所有参数,相当于写$1、$2…$n与循环搭配
$@取出脚本所有参数,相当于写$1、$2…$n与循环搭配
$?检查上一个命令是否执行成功echo $?返回值是0成功 返回值是其他失败
a、 案例 01 – 检查指定服务状态
 脚本内容(01.check_service.sh):
 #!/bin/bash
 #File Name: 01.check_service.sh
 #Version:V1.0
 #Author:lidao996
 #Organization:www.oldboyedu.com
 #Description:
 ​
 #1.vars
 name=$1
 #2.systemctl
 echo"请睁开眼睛看服务是否启动与开机自启动,后续改为if判断"
 systemctl is-active $name
 systemctl is-enabled $name
b、案例 02 – 检查指定的用户是否存在
 脚本内容(02.check_user.sh):
 #!/bin/bash
 #FileName:02.check_user.sh#Version:V1.0
 #Author:lidao996
 #Organization:www.oldboyedu.com
 #Description:
 #1.vars
 name=$1
 ​
 #2.id
 id $name
c、案例 03 – 改造案例 01 和 02 增加脚本参数个数判断功能
 改造后脚本(01.check_service.sh):
 #!/bin/bash
 #FileName:01.check_service.sh
 #Version:V1.0#Author:lidao996
 #Organization:www.oldboyedu.com#Description:
 #1.vars
 name=$1
 #2.check vars
 if [ $# -eq 0 ]
 then echo "Usage: bash $0 server name"
 exit 1
 fi
 #2.systemctl echo"请睁开眼睛看服务是否启动与开机自启动,后续改为if判断"
 systemctl is-active $name
 systemct is-enabled $name
d、案例 04 – 案例 01、案例 02 改造成批量形式
 改造后脚本(01.check_service.sh):
 #!/bin/bash
 #File Name: 01.check_service.sh
 #Version:V1.0
 #Author:lidao996
 #Organization:www.oldboyedu.com
 #Description:
 #1.varsname="$*"
 #2.check vars
 if [ $# -eq 0 ]
 then echo "Usage:bash $0 server name"
 exit 1
 fi
 #2.systemctl echo"请睁开眼睛看服务是否启动与开机自启动,后续改为if判断"
 systemctl is-active $name
 systemctl is-enabled $name
e、案例 05 – 回收站脚本替代 rm 命令
 #1.准备操作:
 df -h /tmp/ 结果示例:
 1.5G 44K 1.5G 1% /tmp
 tmp 目录属于 tmpfs(内存),系统重启后内容消失
 #2.执行以下命令
 umount -lf /tmp;
 systemctl mask tmp.mount
 #3.操作上面两个命令后df -h /tmp/结果示例
  47G   12G   36G   25% /
 
  脚本内容(05.recycle.sh):
 #!/bin/bash
 #File Name:/server/scripts/shell/05.recycle.sh
 #Version:V1.0
 #Author:lidao996
 #Organization:www.oldboyedu.com
 #Description:
 ​
 #1.vars
 files="$∗"
 recycle_dir=`mktemp -d`
 ​
 #2.check
 if [ $# -eq 0 ]
 then echo "Usage: bash $0 files dirs"
 exit 1
 fi
 ​
 #3.mv
 mv  $files  $recycle_dir
 ​
 #4.结果输出
 echo "$files已经放到回收站中,目录$recycle_dir"
 ​
 别名配置:
 临时生效:alias rm='bash /server/scripts/shell/05.recycle.sh'
 永久生效:将上面的命令写入到 vim /etc/profile中
 source /etc/profile
 创建一个文件
 touch a.txt
 删除文件测试
 rm a.txt

三、环境变量

环境变量作用
PATH存放命令的位置 / 目录
PS1命令行格式
LANGlanguage 语言、字符集
UID获取当前用户的 UID,搭配判断是否为 root
f、案例 06 – 安装指定的软件包
 脚本内容(06.install_rpm.sh):
 #!/bin/bash
 #File Name: 06.install_rpm.sh
 #Version:V1.0
 #Author:lidao996
 #Organization:www.oldboyedu.com
 #Description:
 #1.vars
 names="$@"
 #2.root?if [ UID−ne0]
 then echo"You are not root,use root user."
 exit 1
 fi
 #3.$#
 if [ $# -eq 0 ]
 then echo "USAGE: bash $0 packages.."
 exit 2
 fi
 #4.yum
 yum install -y $names
 #5. 待补充检查
 ​
 #6.先用普通用户再用root用户测试
 bash 06.install_rpm.sh tree lrzsz

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注