shell脚本编写守则

现在centos7中使用的是bash软件,通过以下命令可以查看bash版本:

[[email protected] ~]# cat /etc/redhat-release     #查看系统的版本
CentOS Linux release 7.5.1804 (Core)     #我这里使用的是centos 7.5 1804
[[email protected] ~]# bash --version   #查看bash的版本
GNU bash, 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu) #这一行就是bash版本
Copyright (C) 2011 Free Software Foundation, Inc.
许可证 GPLv3+: GNU GPL 许可证版本3或者更高 <http://gnu.org/licenses/gpl.html>

这是自由软件,您可以自由地更改和重新发布。
在法律允许的范围内没有担保.

若生产环境下的服务器使用的是较老版本的系统及shell,那么建议将其升级到最新版的shell,因为近两年老版本被暴露出存在较严重的安全漏洞。

bash软件曾经爆出了严重漏洞(破壳漏洞),凭借此漏洞,别人可能会接管计算机的整个操作系统,得以访问各种系统内的机密信息,并对系统进行更改等。任何人的计算机系统,如果使用了bash软件,都需要立即打上补丁。检测系统是否存在漏洞的方法为:

#测试系统是否存在漏洞
[[email protected] ~]# env x=‘() {:;}; echo be careful‘ bash -c "echo this is a test"
this is a test

返回上面的内容“this is a test”,则表示正常,若返回如下内容,则需要升级bash了,不过,仅仅是用于学习和测试就无所谓了。

[[email protected] ~]# env x=‘() {:;}; echo be careful‘ bash -c "echo this is a test"
be careful
this is a test

提示:如果没有输出be careful,则不需要升级。

升级方法如下:

[[email protected] ~]# rpm -qa bash    #升级前的bash版本
bash-4.2.46-30.el7.x86_64
[[email protected] ~]# yum -y update bash    #执行升级命令
[[email protected] ~]# rpm -qa bash  #升级后的bash版本
bash-4.2.46-31.el7.x86_64

编写shell脚本守则:

1、脚本开头一行注明使用的是哪种解释器,如:#!/bin/sh、#!/bin/bash......。
2、规范脚本的后缀名称,如果是Shell脚本,就是“.sh”;如果是Python脚本,就是“.py”;如果是expect脚本,就是“.exp”。
3、写好注释,不挨骂,脚本中,除第一行使用#号后指定shell,以下所有的#号都表示注释,可以和代码共用一行,也可单独写一行,最好不要出现中文,若不写注释,会遭人骂的,可能自己过段时间也看不懂自己写的脚本了。

shell脚本的执行:

当Shell脚本运行时,它会先查找系统环境变量ENV,该变量指定了环境文件(加载顺序通常是/etc/profile、~/.bash_profile、~/.bashrc、/etc/bashrc等),在加载了上述环境变量文件后,Shell就开始执行Shell脚本中的内容

Shell脚本是从上至下、从左至右依次执行每一行的命令及语句的,即执行完了一个命令后再执行下一个,如果在Shell脚本中遇到子脚本(即脚本嵌套)时,就会先执行子脚本的内容,完成后再返回父脚本继续执行父脚本内后续的命令及语句。

Shell脚本的执行通常可以采用以下几种方式:

  • bash script-name或sh script-name:这是当脚本文件本身没有可执行权限(即文件权限属性x位为-号)时常使用的方法,或者脚本文件开头没有指定解释器时需要使用的方法。这也是推荐使用的方法;
  • path/script-name或./script-name:指在当前路径下执行脚本(脚本需要有执行权限),需要将脚本文件的权限先改为可执行(即文件权限属性加x位),具体方法为chmod+x script-name。然后通过脚本绝对路径或相对路径就可以直接执行脚本了。
  • source script-name或.script-name:这种方法通常是使用source或“.”(点号)读入或加载指定的Shell脚本文件(如san.sh),然后,依次执行指定的Shell脚本文件san.sh中的所有语句。这些语句将在当前父Shell脚本father.sh进程中运行(其他几种模式都会启动新的进程执行子脚本)。因此,使用source或“.”可以将san.sh自身脚本中的变量值或函数等的返回值传递到当前父Shell脚本father.sh中使用。这是它和其他几种方法最大的区别。
  • sh\<script-name或cat scripts-name|sh:同样适用于bash,不过这种用法不是很常见,但有时也可以有出奇制胜的效果,例如:不用循环语句来实现精简开机自启动服务的案例,就是通过将所有字符串拼接为命令的形式,然后经由管道交给bash操作的。

结论:

通过source或“.”加载执行过的脚本,由于是在当前shell中执行脚本,因此在脚本结束之后,脚本中的变量(包括函数)值在当前shell中依然存在;而sh和bash执行脚本时都会启动新的子shell执行,执行完后退回到父shell。因此,变量和函数值等无法保留,在进行shell脚本开发时,如果脚本中有引用或执行其他脚本的内容或配置文件的需求时,最好用“.”或source先加载该脚本或配置文件,处理完成之后,再将他们加载到脚本的下面,就可以调用source加载的脚本及配置文件中的变量及函数等内容了。

编写shell的守则:

  • shell脚本的第一行是指定脚本解释器(不是必须的);
  • shell脚本的开头会加版本、版权等信息,通常由脚本中的第二行开始写(不是必须的);
  • 在shell脚本中尽量不用中文(不仅仅是说注释);
  • shell脚本的命名应以.sh为扩展名。
  • shell脚本应存放在固定的路径下,一般是“/server/scripts”
    以下则是shell脚本代码书写的良好习惯:
  • 成对的符号应该尽量一次写出来,然后退格在符号里增加内容,以防止遗漏。这些符号一般是“{ }”“[ ]”.......
  • 中括号[ ]两端至少要有一个空格,因此,键入括号时即可留出空格,然后在退格键进入中间的内容,并确保两端都至少有一个空格,也就是说先键入一对中括号,然后退一格,输入两个空格,再退一格,双中括号[ [ ] ]的写法也一样。
  • 对于流程控制语句,应一次性将格式写完,再添加内容,很多语言中都是这样的,如:
    一次性完成if语句的格式:
    if 条件内容
    then
    内容
    fi
    一次性完成for循环语句的格式:
    for
    do
    内容
    done

while和until,case等语句也是一样。

  • 通过缩进让代码更易读,比如上面的if、for语句。
  • 对于常规变量的字符串定义变量值应加双引号,并且等号前后不能有空格,需要强引用的(指所见即得的字符引用),则用单引号‘‘,如果是命令的引用,则用反单引号``(该键位于esc键下面),例如:username="lv jian zhao"
  • 脚本中的单引号、双引号及反引号必须是英文状态下的符号,其实所有的Linux字符及符号,都应该是英文状态下的符号,这点需要特别注意。
    说明:好的习惯可以让我们避免很多不必要的麻烦,提升工作效率。

———————— 本文至此结束,感谢阅读 ————————

原文地址:https://blog.51cto.com/14154700/2432361

时间: 2024-08-03 04:03:50

shell脚本编写守则的相关文章

shell脚本编写nginx部署脚本

下面为shell脚本编写的nginx的安装及修改nginx.conf的脚本,脚本比较简单: #!/bin/bash function yum_install(){ yum install epel-release -y yum install nginx -y} yum_install pw=/etc/nginx/nginx.confread -p "请输入组名:" zuread -p "请输入第一个ip地址:" ip1read -p "请输入第二个ip地

shell脚本编写方法

shell脚本编写就如同一门语言,涉及到运行环境.基本语法.变量定义.函数.参数(系统参数).条件判定.执行流程控制 等等问题. 本文就以下几个方面进行描述: 运行环境: shell  shebang  Path 基本语法: 命令.变量.函数.参数.条件.流程控制. 变量相关:定义.命令参数变量和系统参数 与 配置文件读取(-r cron.daily/sysstat脚本中). 函数:定义方法 条件判定与环境测试:-x -d -f 等 执行流程控制:case 等 字符串处理与高级指令: (sed

Shell脚本编写教程

建立一个脚本    Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用.所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在 bash的大姐,bourne shell中运行). 如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit.kedit.emacs.vi 等来编写我们的shell程序. 程序必须以下面的行开始(必须方在文件的第一行):#!

shell 脚本编写基础

在进行Linux测试时编写脚本是必不可少的,Shell脚本的名称可以随便定义,也不要什么后缀名,例如可以写abc,smartzip这类名称,运行时只要键入 ./smartzip就能运行脚本了.. 每行命令开头处不用就空格也行.. 第1部分. linux 脚本编写基础 1.1 语法基本介绍1.1.1 开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执

Shell脚本编写1

1.shell操作系统与外部最主要的接口就叫做shell.shell是操作系统最外面的一层.shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果. shell提供了你与操作系统之间通讯的方式.2.shell脚本Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的.但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更

第三部分shell编程3(shell脚本编写1)

做监控和备份最多 1. shell脚本是什么它是一种脚本语言,并非编程语言可以使用一些逻辑判断.循环等语法可以自定义子函数是系统命令的集合shell脚本可以实现自动化运维,大大增加我们的工作效率 第一个shell脚本:mkdir shellcd shell/vim 1.sh``#! /bin/bash`#This is a test shell script``echo "123456."`touch aming.111`date 2. shell脚本结构以及执行方法开头行指定bash

第十二章 Shell脚本编写及常见面试题(一)

注意事项 1)开头加解释器:#!/bin/bash 2)语法缩进,使用四个空格:多加注释说明. 3)命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 4)默认变量是全局的,在函数中变量local指定为局部变量,避免污染其他作用域. 5)有两个命令能帮助我调试脚本:set -e 遇到执行非0时退出脚本,set-x 打印执行过程. 6)写脚本一定先测试再到生产上. 12.1 获取随机字符串或数字 获取随机8位字符串: 方法1: # echo $RANDOM |md5sum |

第十二章 Shell脚本编写及常见面试题(二)

本章目录: 12.11 屏蔽网站访问频繁的IP 1)屏蔽每分钟访问超过200的IP 方法1:以Nginx日志作为测试 DATE=$(date +%d/%b/%Y:%H:%M) ABNORMAL_IP=$(tail -n5000 access.log |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>100)print i}') #先tail防止文件过大,读取慢,数字可调整每分钟最大的访问量.awk不能直接过滤日志,因为包含特殊字符. for IP

Follow me---快速入门shell脚本编写(二)

上次在写shell的时候发现vi和vim不一样:vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面.vim要比vi好用许多. 这次接着上次的内容,基础知识,继续学习,本文作者也在自学中,纰漏错误在所难免,若有人发现问题请指出谢谢! Lee出品,转载请注明出处http://blog.csdn.net/hnulwt/article/details/43155797 布尔运算符 先大致熟悉一下布尔相关的三个运算符 ! 非运算 -o 或运算(or) -a 与运算(and) 接着