指定一个默认脚本解释器

“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。他指明了当我们没有指定解释器的时候默认的解释器。

为什么建议要在首行加上脚本默认解释器,因为有的操作系统的默认解释器不是sh或者bash,比如SUSE Linux默认的是csh,不能通过 ./ 的方式执行bash或sh脚本。

我们常用sh和bash,这两种是最受欢迎的shell,脚本中写一种即可。如:

#!/bin/bash

我们可以用下面的命令查看本机支持的解释器

$ cat /etc/shells/bin/sh/bin/bash/sbin/nologin/bin/tcsh/bin/csh/bin/dash

添加脚本描述信息

在脚本的前面建议加上脚本描述信息,这样方便查看脚本的信息和有利于脚本的维护工作。

一般的描述信息有:

  • 脚本的写作时间,作者,版权等
  • 脚本的用途
  • 脚本的注意事项
#!/bin/bash # ########################## # Version: 1.0 # Author: 快用大数据 # Create Date : 2021-01-01 # Name: start_all.sh # Description: This is a test shell script # ###########################  # Version: 1.1 # Author: 快用大数据  # Create Date : 2021-01-01 # Name: start_all.sh # Description: Add a function at the bottom # ###########################

脚本文件命名有规范

  • 脚本文件后缀用.sh,方便识别文件为shell脚本.
  • 脚本名称可以根据执行频率、用途、业务分类等在名称中加入些关键字,可以让人顾名思义,对脚本有个认知,如:

如启动脚本:start_all.sh stop_all.sh start_tomcat.sh stop_tomcat.sh

如业务用途脚本:ods_tablename_daliy.sh, dw_tablename_monthly.sh

变量命名有规范

变量的基本命名法则:

  • 统一用小写字母命名,如 DATE="20210101"
  • 由词组组成的变量名与函数名用下划线连将词组连接,如 start_date="20210101",function_name()
  • 过长的变量名可以用驼峰命名法命名

shell日志与回显

在开发过程中,写好业务代码的重要性不言而喻,同样的做好日志记录要非常重要,通过看日志,能够帮我们解决很多问题。

下面是一些日志要注意的信息:

1、 一些DEBUG级别的日志在脚本调试结束后需要关闭。

2、 日志输出要带时间

3、日志的输出推荐使用tee -a ${log_file}的方式,可以直接在main函数入口处添加日志输出

logfile="/var/log/debug.log"# define functionsfunction foo(){    echo "foo"}function oo(){    echo "oo"}# define main functionfunction main(){    echo "START DATE:" $(date +"%Y-%m-%d %H:%M:%S")    foo    oo    echo "FINISH DATE:" $(date +"%Y-%m-%d %H:%M:%S")}# invoke main functionmain|tee -a ${logfile}

标准输出重定向到log文件中,标准错误打印在屏幕上

$ sh start_all.sh > /data/logs/hadoop/debug.log

shell 错误输出重定向到标准输出

$ sh start_all.sh > /data/logs/hadoop/debug.log 2>&1

标准输出和标准错误重定向到不同log文件中

$ sh start_all.sh 1>log.log 2>err.log

使用$()给变量赋值

尽量使用$()将命令的结果赋给变量,而不是用反引号

input_dir=/home/hadoopfiles=$(ls ${input_dir})for file in ${files};do  echo ${file}done;

shell变量引用

很多人喜欢直接用$号加变量名引用该变量,建议使用${变量名}来引用变量,这样不容易出错和混淆。

date="20200101"logfile="/data/logs/hadoop/${date}/debug.log"echo ${logfile}

对比

date="20200101"logfile="/data/logs/hadoop/$date/debug.log"echo $logfile

shell脚本的执行方式

脚本的执行方式有好几种,但是还是建议用脚本解释器来执行脚本。

强烈推荐,用血的教训总结。我们的调度工具在升级后,会修改其工作目录下的所有文件的权限变成只有只读权限 (400),导致升级后所有用./执行的脚本全部不能执行。

$ sh start_all.sh

脚本的执行方式有以下几种:

1、工作目录执行

工作目录执行,指的是执行脚本时,先进入到脚本所在的目录(此时,称为工作目录),然后使用 ./脚本方式执行。前提是脚本有可执行的权限,如果没有会报没有权限错误。

$  ./start_all.sh在没有执行权限时要先加执行权限$ chmod +x ./start_all.sh$ ./start_all.sh

2、绝对路径执行

绝对路径中执行,指的是直接从根目录/到脚本目录的绝对路径。前提是脚本有可执行的权限,否则会报没有权限错误。

$ /home/hadoop/start_all.sh

3、sh执行

sh执行,指的是用脚本对应的sh或bash来接着脚本执行

$ sh start_all.sh

注意,若是以方法三的方式来执行,那么,可以不必事先设定shell脚本的执行权限,甚至都不用写shell文件中的第一行(指定bash路径)。因为方法三是将start_all.sh作为参数传给sh(bash)命令来执行的。这时不是start_all.sh自己来执行,而是被人家调用执行,所以不要执行权限。

4、shell环境执行

shell环境执行,指的是在当前的shell环境中执行,可以使用 . 接脚本 或 source 接脚本

$ . start_all.sh或$ source start_all.sh

shell要有异常处理

要判断一段代码是否出现了异常,一个最基本的判断就是对他返回值的判断。在shell中,我们往往规定0为正常,一切非0返回值则为不正常。但往往我们在写shell脚本的时候,忽略对于返回值的判断。我们看一个很基本的shell程序。

$?这个常量代表的就是上一段shell的返回值,看下面的例子:

#!/bin/shcd /home/xxxx/if [ "$?"= "0" ]; then   rm -rf *else   echo "cannot change directory" 1>&2   exit 1fi

abd shell关闭所有程序_一个 Shell 脚本逆袭的规范,拿走不谢相关推荐

  1. abd shell关闭所有程序_第十六章 Shell编程

    第十六章 Shell编程 16.1 shell脚本运行 所谓脚本,就是把众多命令写入一个文件中,让其按照一定的逻辑顺序执行,以完成一个具体的功能.而在Linux的shell编译环境下,shell编程与 ...

  2. abd shell关闭所有程序_在后台服务器上运行程序

    之前总结过screen的用法,但还可以用nohup命令. nohup工具: Linux系统中有提供一个很好的不挂断地运行命令--nohup.我们使用nohup能很简单的控制使用,在此就简单的介绍一下n ...

  3. shell以分号结尾_一个shell脚本引发的对于分号的使用说明

    背景 由于在工作中需要一次性关闭linux的opt目录下安装的多个tomcat,因此有了写一个脚本统一关闭开启这个目录下所有tomcat的想法 前提 Tomcat安装目录结构:  /opt/tomca ...

  4. 如何从一个普通的屌丝逆袭为一个程序员屌丝?(连载)

    零.题记 屌丝逆袭亘古不变的话题,芸芸众生津津乐道的话题,如何从一个普通的屌丝逆袭呢?如果你早个20年问这个问题,可能是去学土木工程,就好像现在众屌丝纷纷涌向了计算机的相关行业.无疑,高新技术是最能刺 ...

  5. Http Server : 一个差生的逆袭

    我刚毕业那会儿,国家还是包分配工作的, 我的死党小明被分配到了一个叫数据库的大城市,天天都可以坐在高端大气上档次的机房里, 在那里专门执行SQL查询优化 , 工作稳定又舒适: 隔壁宿舍的小白被送到了编 ...

  6. Javascript:一个屌丝的逆袭

    | 来源:码农翻身 微信公众号(id:coderising). 作者:刘欣 是的, 我就是鼎鼎大名的Javascript,  典型的高富帅,前端编程之王,数以百万计的程序员使用我来编程. 如果你没有用 ...

  7. JavaScript:一个屌丝的逆袭,乘风破浪

    JavaScript:一个屌丝的逆袭,乘风破浪 是的,我是大名鼎鼎的JavaScript,典型性的高帅富,前端开发程序编写之首,数以百计的程序猿应用我程序编写.假如你沒有使用过我也太out了.但是当我 ...

  8. 《MacTalk 跨越边界》一一2.4 一个学渣的逆袭

    本节书摘来自异步社区出版社<MacTalk 跨越边界>一书中的第2章,第2.4节,作者: 池建强,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.4 一个学渣 ...

  9. 记住:从来没有一个屌丝能够逆袭!

    5年前,一个叫Brian Acton的人去Facebook应聘,被无情拒绝. 随后,他开发了一款叫WhatsApp的软件. 5年后的今天,Facebook花190亿美元收购了WhatsApp. 有人说 ...

最新文章

  1. keras提取模型中的某一层_keras获得某一层或者某层权重的输出实例
  2. MySQL5.7号称永久解决了复制延迟问题的并行复制
  3. 为Drupal7.22添加富编辑器 on Ubuntu 12.04
  4. kubernetes+Azure DevOps实现.Net Core项目的自动化部署均衡负载
  5. 1.5 基础数据类型 -- 字典与集合
  6. 10位photoshop顶尖设计大师
  7. 目标检测(十九)--SoftNMS
  8. 最实用也最容易被遗忘的 Linux 命令行使用技巧
  9. plc原理及应用_PLC编程与应用 适合初学者
  10. MicrosoftStore无法下载软件
  11. 用在线RaxML构建系统发育树
  12. python将pdf转图片_利用Python将pdf转为图片
  13. 人脸服务器如何与门禁系统对接,人脸识别终端门禁系统解决方案
  14. 安卓camera2 API获取YUV420_888格式详解
  15. java 大量数据返回_怎么接收第三方接口返回的大量数据?
  16. 彩色图像处理(matlab)
  17. iphone版 天行skyline_‎App Store 上的“Skyline University”
  18. 二维码解码程序的两大难点问题
  19. java swfupload 302_swfupload Upload Error 302 错误解决办法
  20. 建立Baseline之repo,manifest

热门文章

  1. prd展示html文件,prd目的.html
  2. 计算机电路的基本罗门,模拟电路设计经验12条
  3. layui登录页面写入数据_layui基本使用(动态获取数据,并把需要的数据传到新打开的窗口)...
  4. 企业为什么要开通银企直联_企业为什么要做网站推广
  5. python线性回归x可以数量不一样吗_R和Python中的线性回归 - 在同一问题上的结果不同...
  6. 绘制Nine-Patch图片
  7. codeforces 701 E. Connecting Universities(树+ 边的贡献)
  8. Maven详解(转)
  9. 【IE6的疯狂之四】IE6文字溢出BUG
  10. struts2-通配符和动态方法调用