羽夏 Bash 简明教程(下)

羽夏 Bash 简明教程下部分,详细介绍了数组、花括号扩展、循环函数,并且还介绍了初学者常见编写 Bash 易犯的错误。

写在前面

  该文章根据 the unix workbench 中的 Bash Programming 进行汉化处理并作出自己的整理,并参考 Bash 脚本教程 和 BashPitfalls 相关内容进行补充修正。一是我对 Bash 的学习记录,二是对大家学习 Bash 有更好的帮助。如对该博文有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我。本篇博文可能比较冗长,请耐心阅读和学习。

数组

内容讲解

  Bash 中的数组是有序的值列表。通过将列表指定给变量名,可以从头开始创建列表。列表是用括号(())创建的,括号中用空格分隔列表中的每个元素。让我们列出几个动物的数组:

animals=(cat dog butterfly fish bird goose cow chick goat pig)

  要检索数组,需要使用参数展开,其中包括美元符号和花括号${}。数组中元素的位置从零开始编号。要获取此数组的第一个元素,请使用${animals[0]},如下所示:

wingsummer@wingsummer-PC ~ → echo ${animals[0]}
cat

  请注意,第一个元素的索引为0。可以通过这种方式获取任意元素,例如第四个元素:

wingsummer@wingsummer-PC ~ → echo ${animals[3]}
fish

  要获得改动物列表的所有元素,请在方括号之间使用星号*

wingsummer@wingsummer-PC ~ → echo ${animals[*]}
cat dog butterfly fish bird goose cow chick goat pig

  还可以通过使用方括号指定其索引来更改数组中的单个元素:

wingsummer@wingsummer-PC ~ → echo ${animals[*]}
cat dog butterfly fish bird goose cow chick goat pig
wingsummer@wingsummer-PC ~ → animals[4]=ant
wingsummer@wingsummer-PC ~ → echo ${animals[*]}
cat dog butterfly fish ant goose cow chick goat pig

  要仅获取数组的一部分,必须指定要从中开始的索引,后跟要从数组中检索的元素数,以冒号分隔:

wingsummer@wingsummer-PC ~ → echo ${animals[*]:5:3}
goose cow chick

  上面的查询本质上是这样的:从数组的第六个元素开始获取3个数组元素(记住第六个元素的索引为5)。
  可以使用#来获取数组的长度:

wingsummer@wingsummer-PC ~ → echo ${#animals[*]}
10

  可以使用加号等于运算符+=将数组添加到数组的末尾:

animals=(cat dog fish)
echo ${animals[*]}
animals+=(cow chick goat)
echo ${animals[*]}

内容总结

  • 数组是一种线性数据结构,具有可存储在变量中的有序元素。
  • 数组的每个元素都有一个索引,第一个索引是0。
  • 可以使用数组的索引来访问数组的各个元素。

小试牛刀

  1. 编写一个 bash 脚本,在脚本中定义一个数组,脚本的第一个参数指示运行脚本时打印到控制台的数组元素的索引。
  2. 编写一个 bash 脚本,在脚本中定义两个数组,当脚本运行时,数组长度的总和将打印到控制台。

相关推荐:

如何在 Vespa 中正确集成 ONNX 模型(PyVespa 教程)

本文详解在pyvespa中部署onnx模型时常见的路径引用错误,指出应用包内不可使用宿主机或docker卷路径,所有模型文件必须打包进应用zip并通过相对路径引用,同时提供可运行的schema配置与部署实践要点。 本文详解在pyvespa中部署onnx模型时常见的路径引用错误,指出应用包内不可使用宿...

Python Textual 教程:正确获取 Input 组件的用户输入值

本文详解如何在textual框架中正确访问input小部件的实时输入值,避免因生命周期误解、方法签名错误或状态同步不当导致的空值、对象引用异常等问题,并提供可运行的完整示例。 本文详解如何在textual框架中正确访问input小部件的实时输入值,避免因生命周期误解、方法签名错误或状态同步不当导致的...

批量按比例调整 XML 中所有商品价格的 PowerShell 教程

本文介绍如何使用PowerShell快速、安全地批量修改大型XML电商目录中所有元素的值(如统一上调/下调50%),适用于含上千条记录的场景,无需手动编辑或第三方工具。 本文介绍如何使用powershell快速、安全地批量修改大型xml电商目录中所有``元素的值(如统一上调/下调50%),适用于含上...

PuLP 教程:如何约束每个任务仅由一名员工执行

本文详解在pulp中建模“单任务单人”约束的方法——通过引入二元分配变量与连续工时变量,并结合大m法(big-m)建立逻辑关联,确保每个任务最多被一名员工承担。 本文详解在pulp中建模“单任务单人”约束的方法——通过引入二元分配变量与连续工时变量,并结合大m法(big-m)建立逻辑关联,确保每个任...

批量按比例更新 XML 中所有商品价格的 PowerShell 教程

本文介绍如何使用PowerShell快速、安全地批量修改大型XML电商目录中所有元素的值(如统一上调/下调50%),适用于含上千条记录的场景,无需手动编辑或依赖第三方工具。 本文介绍如何使用powershell快速、安全地批量修改大型xml电商目录中所有``元素的值(如统一上调/下调50%),适用于...

使用 RBF 插值实现图像非仿射变换的完整教程

本文介绍如何利用scipy.interpolate.RBFInterpolator对OpenCV加载的图像进行基于散点映射的非仿射几何变换,通过向量化NumPy操作高效生成重映射坐标场,并结合cv2.remap完成像素级插值。 本文介绍如何利用`scipy.interpolate.rbfinterp...