文档章节

Linux 中高效编写 Bash 脚本的 10 个技巧

阿dai学长
 阿dai学长
发布于 2017/06/18 10:09
字数 1342
阅读 42
收藏 1

Shell 脚本编程是你在 Linux 下学习或练习编程的最简单的方式。尤其对系统管理员要处理着自动化任务,且要开发新的简单的实用程序或工具等(这里只是仅举几例)更是必备技能。 -- Aaron Kili

 

本文导航

-1、 脚本中多写注释08%

-2、 当运行失败时使脚本退出15%

-3、 当 Bash 用未声明变量时使脚本退出21%

-4、 使用双引号来引用变量26%

-5、 在脚本中使用函数41%

-6、 字符串比较时用 = 而不是 ==49%

-7、 用 \$(command) 而不是老旧的 `command` 来做代换55%

-8、 用 readonly 来声明静态变量65%

-9、 环境变量用大写字母命名,而自定义变量用小写69%

-10、 总是对长脚本进行调试76%

Shell 脚本编程是你在 Linux 下学习或练习编程的最简单的方式。尤其对系统管理员要处理着自动化任务[1],且要开发新的简单的实用程序或工具等(这里只是仅举几例)更是必备技能。

本文中,我们将分享 10 个写出高效可靠的 bash 脚本的实用技巧,它们包括:

1、 脚本中多写注释

这是不仅可应用于 shell 脚本程序中,也可用在其他所有类型的编程中的一种推荐做法。在脚本中作注释能帮你或别人翻阅你的脚本时了解脚本的不同部分所做的工作。

对于刚入门的人来说,注释用#号来定义。

# TecMint 是浏览各类 Linux 文章的最佳站点

2、 当运行失败时使脚本退出

有时即使某些命令运行失败,bash 可能继续去执行脚本,这样就影响到脚本的其余部分(会最终导致逻辑错误)。用下面的行的方式在遇到命令失败时来退出脚本执行:

# 如果命令运行失败让脚本退出执行

set -o errexit

# 或

set -e

3、 当 Bash 用未声明变量时使脚本退出

Bash 也可能会使用能导致起逻辑错误的未声明的变量。因此用下面行的方式去通知 bash 当它尝试去用一个未声明变量时就退出脚本执行:

# 若有用未设置的变量即让脚本退出执行

set -o nounset

# 或

set -u

4、 使用双引号来引用变量

当引用时(使用一个变量的值)用双引号有助于防止由于空格导致单词分割开和由于识别和扩展了通配符而导致的不必要匹配。

看看下面的例子:

#!/bin/bash

# 若命令失败让脚本退出

# 若未设置的变量被使用让脚本退出

echo "Names without double quotes"

echo

names="Tecmint FOSSMint Linusay"

for name in \$names; do

echo "\$name"

done

echo

echo "Names with double quotes"

echo

for name in "\$names"; do

done

exit 0

保存文件并退出,接着如下运行一下:

\$ ./names.sh

在脚本中用双引号

5、 在脚本中使用函数

除了非常小的脚本(只有几行代码),总是记得用函数来使代码模块化且使得脚本更可读和可重用。

写函数的语法如下所示:

function check_root(){

command1;

command2;

}

# 或

check_root(){

}

写成单行代码时,每个命令后要用终止符号:

check_root(){ command1; command2; }

6、 字符串比较时用=而不是==

注意===的同义词,因此仅用个单=来做字符串比较,例如:

value1=”tecmint.com”

value2=”fossmint.com”

if [ "\$value1" = "\$value2" ]

7、 用\$(command)而不是老旧的`command`来做代换

命令代换[2]是用这个命令的输出结果取代命令本身。用而不是引号`command`来做命令代换。

这种做法也是shellcheck tool[3](可针对 shell 脚本显示警告和建议)所建议的。例如:

user=`echo “\$UID”`

user=\$(echo “\$UID”)

8、 用readonly来声明静态变量

静态变量不会改变;它的值一旦在脚本中定义后不能被修改:

readonly passwd_file=”/etc/passwd”

readonly group_file=”/etc/group”

9、 环境变量用大写字母命名,而自定义变量用小写

所有的 bash 环境变量用大写字母去命名,因此用小写字母来命名你的自定义变量以避免变量名冲突:

# 定义自定义变量用小写,而环境变量用大写

nikto_file=”\$HOME/Downloads/nikto-master/program/nikto.pl”

perl “\$nikto_file” -h “\$1”

10、 总是对长脚本进行调试

如果你在写有数千行代码的 bash 脚本,排错可能变成噩梦。为了在脚本执行前易于修正一些错误,要进行一些调试。通过阅读下面给出的指南来掌握此技巧:

如何在 Linux 中启用 Shell 脚本调试模式[4]

如何在 Shell 脚本中执行语法检查调试模式[5]

如何在 Shell 脚本中跟踪调试命令的执行[6]

相关阅读

[1]: 系统管理员要处理着自动化任务 -链接

[2]: 命令代换 -链接

[3]: shellcheck tool -链接

[4]: 如何在 Linux 中启用 Shell 脚本调试模式 -链接

[5]: 如何在 Shell 脚本中执行语法检查调试模式 -链接

[6]: 如何在 Shell 脚本中跟踪调试命令的执行 -链接

[7]: Aaron Kili -链接

本文转载自:https://c.m.163.com/news/a/CN691OTN0511CPOJ.html?spss=newsapp&spsw=1

阿dai学长
粉丝 71
博文 239
码字总数 316135
作品 0
海淀
运维
私信 提问
10个在UNIX或Linux终端上快速工作的建议

你有没有惊讶地看到有人在Unix/ Linux 中工作得非常快,噼里啪啦的敲键盘,快速的启动命令,飞快地执行命令? 在本文中,我共享了一些在Linux中快速、高效工作所遵循的Unix/ Linux命令 实践。...

老率的IT私房菜
01/28
0
0
在windows 10 bash里编写脚本

在windows 10 bash里编写脚本 参照:https://www.howtoip.com/how-to-create-and-run-bash-shell-scripts-on-windows-10/ 例子由自己在windows pro build 15063 linux 子系统里测试完成 如何......

cysky
2018/06/28
0
0
推荐书籍《Linux Shell脚本攻略(第2版)》

本书结合丰富的实际案例介绍了如何利用shell命令快速开发常规任务,如何凭借短短几个命令行从Web挖掘数据的shell脚本,如何通过shell脚本设置以太网和无线LAN,以及如何利用少量命令的组合完...

胡淘峰
2014/03/07
747
0
面向系统管理员的 Bash 指南

使 Bash 工作的更好的技巧。 每个行业都有一个该行业的大师们最常使用的工具。 对于许多系统管理员来说,这个工具就是他们的 shell。 在大多数 Linux 和其他类 Unix 系统上,默认的 shell 是...

10%
2018/08/15
0
0
Linux 预设命令行 —— Bash

这篇文章主要介绍的是 Bash,希望各位能从这篇文章里对 Bash 有一个简单的了解 Bash 是什么 Bash,即 Bourne Again SHell,顾名思义它是和 Shell 有关的。Shell是一个程序,就像你在 Window...

问题终结者
2018/07/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JAVA 8 中新增 lambda 表达式的一些基本应用

import java.util.Arrays;import java.util.List;import java.util.function.Function;import java.util.stream.Collectors;public class TestLambda { public static void......

这是一只小小鸟
25分钟前
3
0
Java向word中插入Excel文件对象

前言: 在word文件中,虽然也有表格。但是有时我们想要将Excel中表格的大量数据直接插入到word文档中,这就需要用到word的插入对象的功能,也就是直接将Excel文件当做对象插入到word中。 本地的...

qianxi
27分钟前
2
0
海量数据下的注册中心 - SOFARegistry 架构介绍

SOFAStack Scalable Open Financial Architecture Stack 是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。 SOFARegi...

SOFAStack
30分钟前
12
0
python操作excel表格

python 对excel的操作 提示:如果需要写多个表,需要把多个表写完在保存,否则会出现表格覆盖问题 此程序 采取一边请求,一边存取,做个异常处理,即可保存已存在的数据 """# sheet的名称,...

鹏灬
32分钟前
1
0
好程序员web前端分享如何理解JS的单线程

好程序员web前端分享如何理解JS单线程,JS本质是单线程的。也就是说,它并不能像JAVA语言那样,两个线程并发执行。 但我们平时看到的JS,分明是可以同时运作很多任务的,这又是怎么回事呢? ...

好程序员IT
36分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部