使用这些编码技巧编写快速、可读的 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 words words[0]='Linux迷' words[1]='LinuxMi' echo ${numbers[@]} ${words[@]}
以上代码输出的数组内容如下:

您可以通过 declare 内置命令检查每个数组引用的声明,如下所示:

在 Bash 中检查数组声明,作者的屏幕截图 您还可以使用最小的语法进行数组操作和处理活动,例如追加新项、删除现有项、处理数组元素、排序等。例如,以下代码删除无效的分数值并打印前三个最高分数:
#!/bin/bash #Linux迷 www.linuxmi.com declare -a marks marks+=(75 65 80 102 26) # class A marks marks+=(103 68) # class B marks # 删除无效标记 for i in "${!marks[@]}"; do if ((marks[i] > 100)); then unset "marks[$i]" fi done # 对所有标记进行排序 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): " coords declare -A "coords=($coords)" if [ ! -v "coords[x]" ]; then coords[x]=5 fi if [ ! -v "coords[y]" ]; then coords[y]=10 fi for key in "${!coords[@]}"; do printf "$key = ${coords[$key]} \n" done
以上源代码向用户请求x和y坐标,为缺失的坐标轴值设置默认值,并在终端上打印它们。在这里,我们使用! -v语法,因为通常我们使用 Python 字典中的 not in。
实现命名参数支持
当您通过 Bash 解释器执行 shell 脚本时,操作系统会创建一个新的 Bash 进程,并将您的脚本文件作为第一个命令行参数。操作系统通常允许您将一系列参数传递给每个操作系统进程。当您为其他命令/进程提供命令行参数时,您也可以将它们传递到您的 Bash 脚本中。假设您需要将两个整数值传递给脚本。然后,您可以轻松使用 和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} ;; esac done 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 str echo $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="Hello World" declare -u uc_str uc_str="Hello" uc_str="World" echo $lc_str # hello world echo $uc_str # WORLD

使用 Bash 变量属性,您可以编写更少出错、更易读、更现代的 shell 脚本。
相关:Bash 特殊变量(,?,#,@,$$,$*) 见 https://www.linuxmi.com/bash-special-variables.html
如果还有什么疑问与建议,请在评论栏里给我们留言。感谢您的阅读。
以上是一文了解什么是 Linux 上的包依赖的详细内容。更多信息请关注PHP中文网其他相关文章!

Linux和Windows在硬件兼容性上不同:Windows有广泛的驱动程序支持,Linux依赖社区和厂商。解决Linux兼容性问题可通过手动编译驱动,如克隆RTL8188EU驱动仓库、编译和安装;Windows用户需管理驱动程序以优化性能。

Linux和Windows在虚拟化支持上的主要区别在于:1)Linux提供KVM和Xen,性能和灵活性突出,适合高定制环境;2)Windows通过Hyper-V支持虚拟化,界面友好,与Microsoft生态系统紧密集成,适合依赖Microsoft软件的企业。

Linux系统管理员的主要任务包括系统监控与性能调优、用户管理、软件包管理、安全管理与备份、故障排查与解决、性能优化与最佳实践。1.使用top、htop等工具监控系统性能,并进行调优。2.通过useradd等命令管理用户账户和权限。3.利用apt、yum管理软件包,确保系统更新和安全。4.配置防火墙、监控日志、进行数据备份以确保系统安全。5.通过日志分析和工具使用进行故障排查和解决。6.优化内核参数和应用配置,遵循最佳实践提升系统性能和稳定性。

学习Linux并不难。1.Linux是一个开源操作系统,基于Unix,广泛应用于服务器、嵌入式系统和个人电脑。2.理解文件系统和权限管理是关键,文件系统是层次化的,权限包括读、写和执行。3.包管理系统如apt和dnf使得软件管理方便。4.进程管理通过ps和top命令实现。5.从基本命令如mkdir、cd、touch和nano开始学习,再尝试高级用法如shell脚本和文本处理。6.常见错误如权限问题可以通过sudo和chmod解决。7.性能优化建议包括使用htop监控资源、清理不必要文件和使用sy

Linux管理员的平均年薪在美国为75,000至95,000美元,欧洲为40,000至60,000欧元。提升薪资可以通过:1.持续学习新技术,如云计算和容器技术;2.积累项目经验并建立Portfolio;3.建立职业网络,拓展人脉。

Linux的主要用途包括:1.服务器操作系统,2.嵌入式系统,3.桌面操作系统,4.开发和测试环境。Linux在这些领域表现出色,提供了稳定性、安全性和高效的开发工具。

互联网运行不依赖单一操作系统,但Linux在其中扮演重要角色。Linux广泛应用于服务器和网络设备,因其稳定性、安全性和可扩展性受欢迎。

Linux操作系统的核心是其命令行界面,通过命令行可以执行各种操作。1.文件和目录操作使用ls、cd、mkdir、rm等命令管理文件和目录。2.用户和权限管理通过useradd、passwd、chmod等命令确保系统安全和资源分配。3.进程管理使用ps、kill等命令监控和控制系统进程。4.网络操作包括ping、ifconfig、ssh等命令配置和管理网络连接。5.系统监控和维护通过top、df、du等命令了解系统运行状态和资源使用情况。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

WebStorm Mac版
好用的JavaScript开发工具