服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

每个程序员都应知道的 5 个 Bash 编码技巧

日期: 来源:Linux公社收集编辑:聆听世界的鱼

点击上方蓝字 ● 关注Linux公社     

使用这些编码技巧编写快速、可读的 Shell 脚本。
Bash 无疑已经成为每个现代类 Unix 系统或基于 Unix 的操作系统的本地内置自动化解决方案。程序员使用 Bash 创建 Shell 脚本来自动化重复的命令行任务。Bash 的主要目标是提供一种最小的语法来执行其他程序并处理它们的退出代码和输出。但是,现代的 Bash 解释器具有完整的命令语言,提供大多数通用编程语言的功能。因此,我们可以通过包含传统的命令行调用和算法代码编写高度可读的Shell脚本。现代的Bash版本引入了关联数组和支持按引用传递的性能相关特性,使 Bash 具有与其他准备好进行 Shell 脚本编写的语言竞争的能力。
在本文中,我将介绍一些 Bash 编码技巧,您可以在您的 Shell 脚本中包含它们,使它们现代化、快速和可读。使用这些技巧,您可以使用 Bash 编写通用编程或算法实现,例如算法原型、实现实用程序,甚至是竞争编程!

在 Shell 脚本中使用数组

传统的 Bash 变量通常没有类型,但是您可以根据特定的处理上下文将其处理为整数、小数或字符串。我们通常使用Bash变量来存储命令输出、算法参数和其他临时值。Bash还支持两种数组类型:一维(按数字索引)和关联(键值结构)。与其他流行的动态类型通用语言(例如Python、PHP 或 JavaScript)一样,使用 Bash 数组非常容易。以下是如何在 Bash 中创建数组的方法:
#!/bin/bash#Linux迷 www.linuxmi.com
numbers=(9 3 1 3 9)
declare -a wordswords[0]='Linux迷'words[1]='LinuxMi'
echo ${numbers[@]} ${words[@]}
以上代码输出的数组内容如下:
您可以通过 declare 内置命令检查每个数组引用的声明,如下所示:
在 Bash 中检查数组声明,作者的屏幕截图 您还可以使用最小的语法进行数组操作和处理活动,例如追加新项、删除现有项、处理数组元素、排序等。例如,以下代码删除无效的分数值并打印前三个最高分数:
#!/bin/bash#Linux迷 www.linuxmi.com
declare -a marksmarks+=(75 65 80 102 26) # class A marksmarks+=(103 68) # class B marks
# 删除无效标记for i in "${!marks[@]}"; do if ((marks[i] > 100)); then unset "marks[$i]" fidone
# 对所有标记进行排序marks_s=($(printf '%s\n' "${marks[@]}" | sort -nr))
# 打印前 3 名echo ${marks_s[0]} ${marks_s[1]} ${marks_s[2]}
以上代码会生成一个单独的进程进行排序,因为我们使用了 sort 外部命令,但是您可以通过使用一些 Bash 代码实现简单的排序算法,例如选择排序,来避免这种情况。

创建映射或字典

在一些编程场景中,我们需要在 shell 脚本中存储键值对数据。程序员通常使用键值数据结构来创建字典结构、映射和缓存容器(通过记忆化)。如果您使用 Python 编写您的 shell 脚本,您可以使用内置的字典数据结构来存储键值数据。如何在 Bash 中使用字典结构?
Bash 4.0 版本引入了关联数组功能,用于存储键值数据。下面是一个 Bash 关联数组的简单示例:
#!/bin/bash#Linux迷 www.linuxmi.com
declare -A marks=([linux]=39 [ubuntu]=27 [debian]=83 [fedora]=59)
for key in "${!marks[@]}"; do printf "$key \t ${marks[$key]} \n"done
在这里,我们使用了 !mapvar[@] 语法来提取所有字典键作为数组进行迭代。上述代码将打印出所有键和对应的值,如下所示:
Bash 让你可以使用最少的语法来操作和访问关联数组数据。使用Bash关联数组的方式就像使用 Python 字典一样。请看下面的例子:
#!/bin/bash#Linux迷 www.linuxmi.com
read -p "Enter coords (i.e., [x]=10 [y]=12): " coordsdeclare -A "coords=($coords)"
if [ ! -v "coords[x]" ]; then coords[x]=5fi
if [ ! -v "coords[y]" ]; then coords[y]=10fi
for key in "${!coords[@]}"; do printf "$key = ${coords[$key]} \n"done
以上源代码向用户请求x和y坐标,为缺失的坐标轴值设置默认值,并在终端上打印它们。在这里,我们使用! -v语法,因为通常我们使用 Python 字典中的 not in。

实现命名参数支持

当您通过 Bash 解释器执行 shell 脚本时,操作系统会创建一个新的 Bash 进程,并将您的脚本文件作为第一个命令行参数。操作系统通常允许您将一系列参数传递给每个操作系统进程。当您为其他命令/进程提供命令行参数时,您也可以将它们传递到您的 Bash 脚本中。假设您需要将两个整数值传递给脚本。然后,您可以轻松使用 $1 和 $2 分别访问第一个和第二个参数值。但是,当您使用更多索引参数并且需要实现可选参数(也称为命令行标志或选项)时,事情将变得复杂。
作为这种情况的解决方案,您可以使用内置的 getopts 来使用命名参数。使用以下 shell 脚本,我们可以覆盖一些脚本中的默认值:
#!/bin/bash#Linux迷 www.linuxmi.com
title="Linux迷 www.linuxmi.com"message="Hello world!www.linuxmi.com Linux迷"
while getopts ":t:m:" option; do echo $option case "${option}" in t) title=${OPTARG} ;; m) message=${OPTARG} ;; esacdone
zenity --info --title="$title" --text="$message"
默认情况下,上面的脚本显示一个带有默认标题和消息的 GTK 消息框,但是您可以使用命名的命令行参数来覆盖它们,如下所示:
./linuxmi.com.sh -t "hello"
./linuxmi.com.sh -m "world"
getopts 内置支持仅使用单个字母选项。您可以使用 getopt 来使用长形式选项(即--title),如此 gist 所示。

使用函数中的引用传递

引用传递是一种编程语言特性,它允许您通过内存引用将数据传递到函数中,而不是将整个数据段复制到新变量中。C ++ 程序员总是努力编写性能优先的代码,对于类对象,结构体和字符串,使用引用传递而不是值传递。
如果您使用的是 Bash 4.3 或更新版本,则可以使用名称引用在 shell 脚本中实现引用传递。以下是一个简单的示例代码片段,通过函数更改字符串变量:
#!/bin/bash#Linux迷 www.linuxmi.com
function change_str_var() { local str_new="Bash" local -n str_ref=$1 echo "$str_ref -> $str_new" # Python -> Bash str_ref=$str_new}
str="Python"change_str_var strecho $str # Bash
上述 change_str_var 函数使用 local 命令创建一个局部的 str_ref 引用,引用全局的 str 变量。然后,它通过覆盖旧字符串值来分配一个新的字符串值。
一些程序员在函数内部使用 echo 命令,并通过命令替换特性调用特定函数以从 Bash 函数返回值(因为原生 Bash return 关键字仅支持返回有效的退出代码)。这会生成另一个子 shell 并消耗更多资源。因此,现在程序员可以使用引用传递并编写性能优先的Bash函数返回,如果他们使用新的 Bash 版本。

使用类型和修饰符属性的变量

Bash 被称为一种无类型命令语言。换句话说,它通常将变量数据处理为字符串,但根据上下文(例如在算术扩展中)进行相应处理。另一方面,Bash 也允许程序员使用类型属性,并提供两种内置的数组类型。即使有了这些功能,我们也不能将 Bash 视为纯动态类型语言,但这些变量属性将Bash置于无类型和动态类型语言之间。
Bash 支持使用整数变量属性将特定变量标记为整数。一旦创建了一个整数变量,当您分配非整数值时,Bash 会发出警告,如下所示:
Bash 还允许使用 declare -r 命令创建常量。每当您的脚本尝试更改常量时,Bash 会在屏幕上打印错误消息。此外,正如我们之前使用的那样,您可以使用 declare 内置函数创建数组。
Bash 还允许您为变量添加一些修饰符属性。例如,您可以创建仅包含小写字母或大写字母的字符串,如下所示:
declare -l lc_str="Linux迷"declare -u uc_struc_str="Linux迷"uc_str="www.linuxmi.com"
echo $lc_str # Linux迷echo $uc_str # WWW.LINUXMI.COM
使用 Bash 变量属性,您可以编写更少出错、更易读、更现代的 shell 脚本。
相关:Bash 特殊变量($0,$?,$#,$@,$$,$*) 见 https://www.linuxmi.com/bash-special-variables.html
感谢大家的阅读,祝大家度过美好的一天!

感谢 Linux迷 www.linuxmi.com 的精彩分享。
OK,这就是本文的内容。如果还有什么疑问,请在下面的评论区告诉我们。
需要 Linux 精美艺术壁纸的朋友请加小编微信linuxgs口令壁纸)。
来自:Linux迷
链接:https://www.linuxmi.com/bash-coding-skills-programmer.html
关注我们

长按或扫描下面二维码关注 Linux公社



关注 Linux公社,添加“ 星标 

每天 获取 技术干货,让我们一起成长

合作联系:root@linuxidc.net

相关阅读

  • Spring Boot 整合 Groovy 脚本,实现动态编程

  • 关注我,回复关键字“spring”,免费领取Spring学习资料。来源:blog.csdn.net/weixin_33005117/article/details/126712394Groovy简介Groovy 是增强 Java 平台的唯一的脚本语言。
  • Bash 特殊变量,功能强大的 Shell

  • 点击上方蓝字 ● 关注Linux公社 Bash 是一个功能强大的 Shell,提供了各种特殊变量,可以用于操作和控制脚本的行为。这些变量提供了有关脚本运行环境的基本信息,包括命令行
  • 2023年清明三种祭扫服务指引来了→

  • 清明是祭奠先人、追思故人的传统节日。今年本市清明祭扫服务集中接待日从3月18日开始至4月9日结束,总计23天,预计3月25日、26日,4月1日、2日、5日为祭扫高峰日。今年本市推出了

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 【校招】中国纺织建设规划院2023年公开招聘公告

  • 中国纺织建设规划院(CTPIC)成立于1989年,专注纺织服装行业30余年,是中国纺织服装领域行业规划研究和工程技术咨询的权威单位,是中国纺织服装行业工程咨询唯一国家级咨询机构,拥
  • 【校招】中国移动2023春招启动

  • ———— / END / ————推荐阅读▼(点击图片即可获取全文)责任编辑丨赵姝彤执行主编丨刘海草 张灏然内容来源丨中国移动
  • 最新明确:禁止!事关中小学……

  • 3月24日,教育部、财政部等五部门联合印发《校外培训机构财务管理暂行办法》的通知,明确中小学校不得举办或参与举办校外培训机构。校外培训不得使用培训贷方式缴纳培训费用。
  • 每个程序员都应知道的 5 个 Bash 编码技巧

  • 点击上方蓝字 ● 关注Linux公社 使用这些编码技巧编写快速、可读的 Shell 脚本。Bash 无疑已经成为每个现代类 Unix 系统或基于 Unix 的操作系统的本地内置自动化解决方
  • 陈胜前:中华文明起源中的边缘发展现象

  • 作者:陈胜前来源:《光明日报》(2023年3月22日 第11版)山西襄汾陶寺遗址古天文台。资料图片本文所谓“边缘”,是指人类文化适应上存在边缘效应的地方。边缘效应的说法来自生态学,如