linux脚本编写规则,shell脚本编写守则

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

[root@localhost ~]# cat /etc/redhat-release #查看系统的版本

CentOS Linux release 7.5.1804 (Core) #我这里使用的是centos 7.5 1804

[root@localhost ~]# 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或者更高

这是自由软件,您可以自由地更改和重新发布。

在法律允许的范围内没有担保.

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

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

#测试系统是否存在漏洞

[root@localhost ~]# env x='() {:;}; echo be careful' bash -c "echo this is a test"

this is a test

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

[root@localhost ~]# env x='() {:;}; echo be careful' bash -c "echo this is a test"

be careful

this is a test

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

升级方法如下:

[root@localhost ~]# rpm -qa bash #升级前的bash版本

bash-4.2.46-30.el7.x86_64

[root@localhost ~]# yum -y update bash #执行升级命令

[root@localhost ~]# 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\

结论:

通过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字符及符号,都应该是英文状态下的符号,这点需要特别注意。

说明:好的习惯可以让我们避免很多不必要的麻烦,提升工作效率。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

luogu P2516 [HAOI2010]最长公共子序列

传送门 首先那个\(O(n^2)\)的dp都会吧,不会自己找博客或者问别人,或是去做模板题(误) 对以下内容不理解的,强势推荐flash的博客 我们除了原来记录最长上升子序列的\(f_{i,j}\),再记\(g_{i,j}\)表示到\(i,j\)时的最长上升子序列个数,同时设两个字符串为\(A,B\) 若\(A_iB_j\) ,则…

怎么让员工服从管理_为什么现在的员工执行力和服从性越来越差,管理一严格就辞职?...

当有负面情绪的时候,不要说。管好自己的嘴,有时候做哑巴,是一种境界。现在的企业很多都存在这个问题,员工执行力越来越差,服从性也越来越差,管理者稍微一严格,员工就会辞职走人,留不…

Spring Data REST的实际应用

什么是春天数据休息? spring-data-rest是spring-data项目的新增功能,它是一个框架,可帮助您将实体直接作为RESTful Web服务端点公开。 与rails,grails或roo不同,它不会生成任何实现此目标的代码。 spring data-rest支持…

2018上半年掘金微信群日报优质文章合集:前端篇

在掘金微信交流群里的小伙伴们,你们每天都还在坚持读小报吗?如果你的回答是yes,那真的要给你点一万个赞了?能坚持这么久,真的很优秀噢!(嗯,每天坚持给大家收集文章的小饼也很优秀?&#xff09…

linux运维笔试题目,linux运维相关的笔试题目_笔试题目

一、Linux系统和shell1、写一个sed命令,修改/tmp/input.txt文件的内容,要求:①删除所有空行;②在非空行前面加一个“AAA”,在行尾加一个“BBB”,即将内容为“11111”的一行改为:“AAA11111BBB”…

python之路--day17-shelve,xml和re模块

shelve模块 shelve模块只有一个open函数,返回类似字典的对象,可读可写,key必须为字符串,而值可以是python所支持的数据类型 1 import shelve2 # info1{age:18,height:180,weight:80}3 # info2{age:73,height:150,weight:80}4 #5 #…

20172314 2018-2019-1《程序设计与数据结构》第一周学习总结

教材学习内容总结 概述 软件工程:是一门关于高质量软件开发的技术和理论的学科,用来控制开发过程,实现高质量的软件。软件工程的目标:正确性、可靠性、健壮性、可用性、可维护性、可重用性、可移植性、运行效率。 对于可靠性和健壮…

activiti api文档_【白银人机】Activiti 工作流从入门到入土:完整 hello world 大比拼(API 结合实例讲解)...

点击上方“好好学java”,选择“置顶”公众号重磅资源、干货,第一时间送达重磅推荐 ① 纯福利 | 公众号资源大汇总,一年才一次!② 重磅!!2018年Java全套入门到进阶学习视频及项目实战③ 2018年java架构师学习…

弹簧可配置魔术

Spring框架有几个提供一系列服务的模块,其中许多模块仅可用于托管对象(Spring Bean)。有关这些服务的一些示例是依赖注入,事务管理,AOP服务等。当我们使用时,一切都很好对象即服务,因此由Spring…

前端解读控制反转(IOC)

前言 随着前端承担的职责越来越重,前端应用向着复杂化、规模化的方向发展。大型项目模块化是一种趋势,不可避免模块之间要相互依赖,此外还有很多第三方包。这样的话如何去管理这些繁杂的文件,是一个不可避免的话题。此时作为一种…

ASP.NET MVC传递参数(model), 如何保持TempData的持久性

一看到此标题,相信你也会。因为路由是可以从URL地址栏传过去的。但是Insus.NET不想在地址栏传递,还是一个条件是jQuery的Ajax进行POST的。Insus.NET不清楚别人是怎样处理的,但是这个让Insus.NET花上不少时间来解决。Insus.NET实现的方法也很简…

深度学习语音降噪方法对比_人工智能-关于深度学习的基础方法

深度学习概述深度学习的一些简介,其要点如下:深度学习实际上是基于具有多个隐藏层的神经网络的学习;深度学习的思想来源于人类处理视觉信息的方式;深度学习的发展得益于数据的井喷和计算力的飙升;深度学习的理论基础依…

通过adb巧用monkey获取android设备中所有应用的主activity

由于工作需要,想获取所有应用的activity(这里仅限应用的主入口Launcher activity),搜索了一下,网上实现的方案都是基于android编程实现的,对于不懂开发的测试来说稍有难度,而且对于PC端测试工具来说可行性略差。 给大家…

linux转换vcf格式,如何使用awk分割vCard通讯录文件(.vcf)

写这个的缘由是某人最近要从某旧山寨手机给某(更旧的)NOKIA手机同步通讯录,由于某山寨android手机输出的vCard文件是单文件里面包含多个记录数据的格式,而NOKIA的古老同步软件只支持单记录vcf,所以就要将单个vCard文件分割成多个vcf&#xff…

PWA · 前后端协作 · Node | JTalk 掘金线下活动第七期

通知 余票仅剩 3张,欢迎加入活动群获取更多通知。北京的小伙伴可以关注我们的 JTalk 第八期:前端安全 | 美团点评技术团队专场 ? 报名 扫码报名: 报名链接:点我报名 ? 介绍 本期 JTalk 来杭州啦! 掘金线下活动 J…

替代JavaOne 2013

我对无法参加JavaOne 2013感到很失望,但是很高兴看到涵盖这个年度会议的大量有用帖子。 在这篇文章中,我链接到许多这些资源,并提供了每篇文章相对于JavaOne 2013讨论内容的简短摘要。 主题演讲 主题演讲是“大公告”趋向于发生的地方。 幸运…

指数函数中x的取值范围_基本初等函数I: 指数函数、对数函数和幂函数

本文大约4800字, 建议学习时间1个小时.在学习过一次函数和二次函数(修改版)后, 我们知道, 一次函数ykxb当一次项系数k大于零时是增函数, 小于零时是减函数. 二次函数yax2bxc当二次项系数a大于零时图象沿x轴从左向右先减后增, a小于零时先增后减. 可以想象, 次数更高的函数, 在定…

Linux系统之TroubleShooting(启动故障排除)

尽管Linux系统非常强大,稳定,但是我们在使用过程当中,如果人为操作不当,仍然会影响系统,甚至可能使得系统无法开机,无法运行服务等等各种问题。那么这篇博文就总结一下一些常见的故障排除方法,但…

皮肤可配置化:变量、样式分离

之前皮肤开发了一个版本,抽是抽出来了,但是变量只抽出了几个颜色,没什么价值(上个版本开发过程), 这次我又进行了一次迭代,现在是一个较成熟的版本了。整体理一下思路,可以总结为3步…

linux下jboss分析helloword,JBoss 中运行servlet 的helloworld程序(转)

一..在server/default/deploy下创建test.war文件夹在test.war 下建WEB-INF文件夹在WEB-INF下建classes文件夹和web.xml二、运行在C:\jboss-3.2.1_tomcat-4.1.24\bin下点击run.bat运行。测试方法如下:http://localhost:8080/jmx-console看到jmx agent view表示成功三…