Linux centOS7 bash编程小技巧

news2024/11/14 18:33:01

 本文中,我们将分享多个高效可靠的 bash 脚本的实用技巧,它们包括如何命令文件、如何命名变量而不随意命名、如何使用数据和函数,如何运行脚本和测试脚本。

1.文件名

虽然在linux中有没有文件名后缀都可以,但为了区别其他文件,特别要标明bash代码,最好后.sh后缀。

文件名虽支持中文,为了国际交际,不要用汉语拼音,简单英文单词可网上搜一下。

为了表达文件功能、作用等,可采用蛇形命令法、大驼峰命令法、小驼峰命令法等。最好形成一种习惯。

2.头部编写

第一行按要求正确编写:

        #!/bin/bash

第二行最好是空行

第三行及后几行可注明代码作者、代码主要功能或作用、编写日期等。

3.注意空行

空行不是多此一举。主要作用是区分代码功能、自定义函数、变量、主函数等。把空行作为功能分隔符。

4.多添加注释

注释的作用无须咨疑。为个人代码作标志,也方便其他人理解阅读脚本的不同部分所做的工作。

特别是初学者,练习对每一行代码作注释,会提高个人代码阅读能力,进而提高编程水平,这是基本功,应多做练习。

这是不仅可应用于shell脚本程序中,也可用在其他所有类型的编程中的一种推荐做法。

单行注释用#号来定义。为清晰,可在#与注释内容间添加一个空格。用一个#与用两个##相同。

单行注释可以放在代码前一行,独立成行。也可以放在代码右边单独说明此行代码的作用或目的。

多行注释在bash代码中用的不多,可用在需要注释的每行行首添加#。

如想添加多行注释,bash也定义了格式:

        :<<!

                多行注释内容

        !

其中符号!可用@$%|等替换(不能用#替换,原因很明显,#已用作单行注释)。

5.循环实现

常用循环是for循环,有两种常用写法:一是C语言风格,另一是for * in ***

while循环也是常用循环,主要用于不确定的循环次数的情况。写法有许多变化,掌握循环三要素十分重要:循环起点,循环条件,终止条件。

6.条件判断

条件判断有两种写法:test与[ ]。建议使用[ ],一定条件下可考虑[[  ]]。

7.多条件编写

可用&& ||连接,也可用-a -o连接。注重二者的使用差别。

8.符号运用

学会使用单括号()及双括号(( ))、方括号及双方括号[[ ]]。大括号C语言用的多,bash用缩进来表达代码块,大括号用的不多。

!是非运算,有时与not功能相同。

使用双引号来引用变量

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

看看下面的例子:

=和==的区别

字符串比较时用 = 或者 ==

变量赋值时只能用=,而不能用 ==。如用==,是另外的含义

一般规定:=是变量赋值 ==是判断是否相等

经测试:

字符串比较时可用=或者==

数字比较时也可以用=或==

命令替换

命令替换是用这个命令的输出结果取代命令本身。用 $(command) 而不是反引号`command`来做命令代换。

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

readonly声明静态变量

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

环境变量

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

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

9.函数编写

在脚本中使用函数,减少代码重复。特别是有些代码重复率高时,更应该编写函数。

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

写函数的语法如下所示:

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

        sum_two(){ a=$1; b=$2; sum=$a+$b; return $sum;}

定义函数时,可加关键字function,也可以省略。

10.数组运用

bash只支持一维数组,但参数个数没有限制。

如声明一个数组:

        declare -a array

a.定义数组

(1) 使用[]操作符

        age[0]=18

        age[1]=19

(2) 使用()直接赋值

        age=(18 19 20)

        # 或

        age=([0]=18 [1]=19 [2]=20)

(3)从文件中读取数组

        cat test.txt

        zhang3

        lisi

        zhaoliu

        chener

        wuda

# 将每一行读取为数组的一个元素

        test=($(cat  test.txt))

b.读取数组

(1) 数组取值

bash使用[]操作符和基于0的下标来取值

(2)数组长度(元素个数)

使用"@"这个特殊的下标,可以将数组扩展成列表,然后就可以使用bash中的获取变量长度的操作符"#"来获取数组中元素的个数:

        age5=(18 19 20)

        echo ${#age5[@]}

        # 打印

        # 3

11.执行文件方式

三种执行方式,推荐第一种,其他两类,可以测试时使用。

a.为文件添加执行权限,执行

如准备运行test_sum.sh脚本文件,首先加权限:

        chmod u+x test_sum.sh

加权限后可用ll查看

        ll test_sum.sh

执行时,可用相对路径 ./test_sum.sh

./的意思是说在当前的工作目录下执行test_sum.sh。如果不加上./,bash可能会响应找到不到hello.sh的错误信息。因为目前的工作目录(/home/zhang3)可能不在执行程序默认的搜索路径之列,也就是说,不在环境变量PATH的内容之中。查看PATH的内容可用echo $PATH命令。现在的/home/zhang3就不在环境变量PATH中的,所以必须加上./才可执行。

也可用绝对路径/home/zhang3/test_sum.sh

b.直接用bash(或sh)命令,把文件名作为参数

        bash test_sum.sh

        sh test_sum.sh

c.直接用命令source(或 .)

        source test_sum.sh

        . test_sum.sh

.后面要有空格

此时用source命令和.,不能用相对路径。文件名可以作为命令参数,而加上./将产生错误。这是与bash(sh)命令的重大不同。

当脚本文件中有不可执行的命令或代码时,将退出整个bash,而不是仅仅退出当前shell。

修改脚本代码后,可以用绝对路径执行,而用相对路径仍然退出终端(相当于退出整个bash进程)。

12.调试

如果你在写有数千行代码的bash脚本,排错可能变成噩梦。为了在脚本执行前易于修正一些错误,要进行一些调试。

编写代码都不能保证不出问题,如何检查,如何调试十分重要。学习bash命令的几个常用选项,方便调试代码:

a. -x  显示执行过程

当 Bash 声明变量时使脚本退出

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

-u 遇到未定义的变量,退出程序

当运行失败时使脚本退出

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

-e遇到程序语法错误,退出程序

在执行脚本文件时,加-v选项,将执行过的脚本命令打印到屏幕:

在执行脚本文件时,加-n选项,仅检查脚本国的语法错误。

b.打印命令使用

在代码的关键处,可添加打印输出,调试代码成功后,可把部分打印输出命令注释掉。

这是一个好习惯!

小结

bash使用中,有许多规定,也有相当多的使用技巧,只有多加学习与训练,才能真正掌握。

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

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

相关文章

嵌入式学习笔记(1)ARM的编程模式和7种工作模式

ARM提供的指令集 ARM态-ARM指令集&#xff08;32-bit&#xff09; Thumb态-Thumb指令集&#xff08;16-bit&#xff09; Thumb2态-Thumb2指令集&#xff08;16 & 32 bit&#xff09; Thumb指令集是对ARM指令集的一个子集重新编码得到的&#xff0c;指令长度为16位。通常在…

python+TensorFlow实现人脸识别智能小程序的项目(包含TensorFlow版本与Pytorch版本)(二)

pythonTensorFlow实现人脸识别智能小程序的项目&#xff08;包含TensorFlow版本与Pytorch版本&#xff09;&#xff08;二&#xff09; 1、人脸业务流程1、人脸检测&#xff08;Face Detection&#xff09;问题2、人脸对齐&#xff08;Face Alignment&#xff09;问题3、人脸属…

【Locomotor运动模块】抓取

文章目录 前言一、主要组件及其设置二、案例&#xff1a;右手柄抓取立方体三、“次抓取” 五种方式 前言 参照B站VRTK4.0教程&#xff1a;L30 可以抓取的物体 一、主要组件及其设置 Interactor交互器 :设置Grab Action、Velocity Tracker Interactable可交互物体:设置“主抓…

卷积神经网络实现运动鞋识别 - P5

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;Pytorch实战 | 第P5周&#xff1a;运动鞋识别&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 目录…

【git】从一个git仓库迁移到另外一个git仓库

在远端服务器创建一个新的仓库 用界面创建&#xff0c;当然也可以用命令创建 拉去源仓库 git clone --bare git192.168.10.10:java/common.gitgit clone --bare <旧仓库地址>拉去成功以后会出现 进入到文件夹内部 出现下面信息&#xff1a; 推送到新的远端仓库 git …

Sharding-JDBC分片策略

Sharding-JDBC分片策略 包含分片键和分片算法&#xff0c;由于分片算法的独立性&#xff0c;将其独立抽离。真正可用于分片操作的是分片键 分片算法&#xff0c;也就是分片策略。目前提供5种分片策略。 一个好的分片策略好的分片键好的的分片算法 1. 标准分片策略 对应Stan…

3D数字孪生技术助力港口全新升级,提供实时数据进行智能调度

港口3D数字孪生平台是一种基于数字技术的虚拟模型&#xff0c;它可以模拟真实的港口环境&#xff0c;并对港口的运营、管理、安全等方面进行实时监控和优化。该平台带来了许多智能化提升&#xff0c;包括以下几个方面&#xff1a; 一、自动化操作和智能调度 数字孪生平台可以通…

ssm珠宝首饰交易平台源码和论文

ssm珠宝首饰交易平台源码和论文101 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&a…

在SOLIDWORKS的Toolbox中,表达轴承的承受能力与寿命计算器

轴承作为机械设计中最常用的标准件之一&#xff0c;在选型时需要对其进行严格的能力和寿命的计算。手工计算涉及到诸多的公式和参数&#xff0c;需要较多的精力去完成计算的工作。 在SOLIDWORKS的Toolbox中便包含了针对于轴承的计算器&#xff0c;通过该工具可以非常快速的计算…

MySQL主从复制案例

主从复制与读写分离 在实际的生产环境中&#xff0c;对数据库的读和写都在同一个数据库服务器中&#xff0c;是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此&#xff0c;通过主从复制的方式来同步数据&#xff0c;再通…

Apinto 网关 V0.14 版本发布,6 大插件更新!

大家好&#xff01; 距离上次更新已经过去一段时间了&#xff0c;这段日子里我们一直在酝酿新的功能&#xff0c;本次的迭代将给大家带来 6 大插件的更新~一起来看看有哪些变化吧&#xff01; 新特性 1. 新增 额外参数v2 插件&#xff0c;支持对转发参数进行加密、拼接等操作…

对话出海企业:2023亚马逊云科技出海日圆桌论坛

在全球经济亟待复苏的今天&#xff0c;持续对外开放是中国未来经济发展重要的“两条腿”之一。在愈发饱和的国内市场&#xff0c;中国企业需要对外寻找全新机遇才能在未来不确定的市场博弈下生存下去。“出海”&#xff0c;也成为近几年最炙手可热的词汇之一&#xff0c;大量中…

ArcGIS Maps SDK for JS(一):概述与使用

文章目录 1 概述2 如何使用ArcGIS Maps SDK for JavaScript2.1 AMD 模块与 ES 模块2.2 AMD 模块和 ES 模块比较 3 几种安装方式3.1 通过 ArcGIS CDN 获取 AMD 模块3.2 通过 NPM 运行 ES 模块3.3 通过 CDN 获取 ES 模块3.4 本地构建 ES3.5 本地构建 AMD 3 VSCode下载与安装2.1 下…

JDK源码解析-LinkedList

1. LinkedList类 1.1 LinkedList类定义&数据结构 定义 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列&#xff0c;它是基于双向链表实现的。 数据结构 基础知识补充 单向链表&#xff1a; element&#xff1a;用来存放元素 next&#xff1a;用来…

Leetcode Top 100 Liked Questions(序号141~189)

​ 141. Linked List Cycle ​ 题意&#xff1a;给你一个链表&#xff0c;判断链表有没有环 我的思路 两个指针&#xff0c;一个每次走两步&#xff0c;一个每次走一步&#xff0c;如果走两步的那个走到了NULL&#xff0c;那说明没有环&#xff0c;如果两个指针指向相等&…

取一个整数各偶数位上的数构成一个新的数字

1 题目 我可太难了&#xff0c;这题我的思路有点复杂&#xff0c;遇到的困难很多&#xff0c;总是值传递搞不清楚&#xff0c;地址传递总是写错。 从低位开始取出一个整数s的各奇数位上的数&#xff0c;剩下的偶数位的数依次构成一个新数t。 例如&#xff1a; 输入s&#xff…

VB:水仙花数问题

VB&#xff1a;水仙花数问题 Private Sub Command1_Click()Rem 水仙花数问题Dim x%, a%, b%, c%, z%n 0For x 100 To 999a Fix(x / 100) Fix函数是去尾的作用&#xff0c;只保留整数部分&#xff0c;当然也可以直接用整除(\)b Fix((x - a * 100) / 10)c x Mod 10z a ^ 3…

C语言中的分支和循环语句:从入门到精通

分支和循环语句 1. 前言2. 预备知识2.1 getchar函数2.2 putchar函数2.3 计算数组的元素个数2.4 清屏2.5 程序的暂停2.6 字符串的比较 3. 结构化3.1 顺序结构3.2 分支结构3.3 循环结构 4. 真假性5. 分支语句&#xff08;选择结构&#xff09;5.1 if语句5.1.1 语法形式5.1.2 else…

人气总冠军-商艺馨 | 第11季中国好猫步辽宁总决赛

第十一季中国好猫步 辽宁总决赛 中国好猫步少儿模特赛事活动属于CCAC大满贯赛事中的大师赛&#xff0c;一直以来&#xff0c;以华丽的舞美、创意丰富的赛制、贴心的服务、丰厚的奖励和众多媒体曝光优势&#xff0c;成为无数少儿模特梦寐以求登上的舞台&#xff01;并且多次登上…

CG MAGIC进行实体渲染后!分析渲染器CR和VR的区别之处!

新手小白来说&#xff0c;如何选择渲染器&#xff0c;都会提出疑问&#xff1f; 渲染效果图究竟用CR渲染器还是VR渲染器呢&#xff1f; 今天&#xff0c;CG MAGIC小编通过一个真实的项目场景&#xff0c;实例渲染之后&#xff0c;CR渲染器和VR渲染器区别有哪几点&#xff1f; 1…