如何在 Bash 中对数组进行排序

2024-01-11

我在 Bash 中有一个数组,例如:

array=(a c b f 3 5)

我需要对数组进行排序。不仅仅是以排序的方式显示内容,而是获取包含排序后的元素的新数组。新的排序数组可以是全新的,也可以是旧的。


您实际上并不需要那么多代码:

IFS=$'\n' sorted=($(sort <<<"${array[*]}"))
unset IFS

支持元素中的空格(只要不是换行符),and在 Bash 3.x 中工作。

e.g.:

$ array=("a c" b f "3 5")
$ IFS=$'\n' sorted=($(sort <<<"${array[*]}")); unset IFS
$ printf "[%s]\n" "${sorted[@]}"
[3 5]
[a c]
[b]
[f]

Note:@sorontar 有指出 https://stackoverflow.com/questions/7442417/how-to-sort-an-array-in-bash/11789688?noredirect=1#comment67720230_11789688如果元素包含通配符,则需要小心,例如* or ?:

Sorted=($(...)) 部分使用“split and glob”运算符。你应该关闭全局:set -f or set -o noglob or shopt -op noglob或数组的一个元素,例如*将扩展为文件列表。

发生了什么:

结果是按以下顺序发生的六件事达到顶峰:

  1. IFS=$'\n'
  2. "${array[*]}"
  3. <<<
  4. sort
  5. sorted=($(...))
  6. unset IFS

首先,IFS=$'\n'

这是我们操作的一个重要部分,它通过以下方式影响 2 和 5 的结果:

Given:

  • "${array[*]}"扩展到由第一个字符分隔的每个元素IFS
  • sorted=()通过分割每个字符来创建元素IFS

IFS=$'\n' 安排事情 https://unix.stackexchange.com/questions/184863/what-is-the-meaning-of-ifs-n-in-bash-scripting这样元素就可以使用扩展一条新线作为分隔符,然后以每行成为一个元素的方式创建。 (即在新行上拆分。)

用新行分隔很重要,因为这就是sort操作(每行排序)。分割依据only新行并不那么重要,但需要保留包含空格或制表符的元素。

默认值为IFS is a space, a tab, 其次是一条新线,并且不适合我们的操作。

接下来,sort <<<"${array[*]}" part

<<<,称为这里是字符串 https://unix.stackexchange.com/questions/80362/what-does-mean, 取展开式"${array[*]}",如上所述,并将其输入到标准输入中sort.

以我们的例子来说,sort被输入以下字符串:

a c
b
f
3 5

Since sort sorts,它产生:

3 5
a c
b
f

接下来,sorted=($(...)) part

The $(...)部分,称为命令替换 http://www.tldp.org/LDP/abs/html/commandsub.html,导致其内容(sort <<<"${array[*]})作为普通命令运行,同时获取结果标准输出就像字面意思一样$(...) was.

在我们的示例中,这会产生类似于简单编写的内容:

sorted=(3 5
a c
b
f
)

sorted然后变成一个数组,通过在每个新行上分割这个文字来创建。

最后,unset IFS

这将重置值IFS为默认值,这只是一个很好的做法。

这是为了确保我们不会对任何依赖的东西造成麻烦IFS稍后在我们的脚本中。 (否则我们需要记住我们已经改变了一些东西——这对于复杂的脚本来说可能不切实际。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Bash 中对数组进行排序 的相关文章

  • 在汇编中初始化字符串数组

    我想创建一个数据数组 在初始化数据部分保存 5 个字符串 每个字符串正好有 4 个字符 每个字符串都有一些初始数据 例如第一个字符串的 abcd 第二个字符串的 efgh 等等 无效的 0任何字符串都不需要字符 如何用汇编语言初始化字符串数
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 检查 Git 中是否需要 pull

    如何检查远程存储库是否已更改并且需要拉取 现在我使用这个简单的脚本 git pull dry run grep q v Already up to date changed 1 但它比较重 有没有更好的办法 理想的解决方案是检查所有远程分支
  • 数组与列表的性能

    假设您需要一个需要频繁迭代的整数列表 数组 我的意思是非常频繁 原因可能有所不同 但可以说它位于大容量处理的最内层循环的核心 一般来说 人们会选择使用列表 List 因为它们的大小具有灵活性 最重要的是 msdn 文档声称列表在内部使用数组
  • 终端关闭时 bash 收到的信号

    使用 trap 来捕获信号 如下所示 i 1 while i lt 33 do trap echo i gt gt log txt i done 并强行关闭终端 那么log txt中的内容就是 redhat linux下 1 18 1 17
  • JDBC插入实数数组

    我试图将一个真实的数组插入到 postgresql 数组中 该表的定义是 String sqlTable CREATE TABLE IF NOT EXISTS ccmBlock sampleId INTEGER block REAL 插入内
  • 对范围值进行排序

    我想对表示数值范围的字符串数组进行排序 如下所示 b 0 5 100 250 5 25 50 100 250 500 25 50 使用sort我得到的方法 b sort gt 0 5 100 250 25 50 250 500 5 25 5
  • 如何构建 if 语句并与各种值进行比较?

    我该怎么写这个if以更好的方式声明条件 if data in 8 downto 1 x 70 or data in 8 downto 1 x 69 or data in 8 downto 1 x 72 or data in 8 downto
  • Rails 4.1 环境变量未重新加载

    我创建了一个application yml文件在配置目录中并添加了一些键值对 即AWS REGION us east 1 我还添加了以下内容application rb读取文件并更新 ENV 哈希 if Rails env developm
  • Bash 中的动态变量名称

    我对 bash 脚本感到困惑 我有以下代码 function grep search magic way to define magic variable 1 ls tail 1 echo magic variable 1 我希望能够创建一
  • 为什么 Git Bash 无法运行我的可执行文件?

    I am on git for windows https github com git for windows 吉特 巴什 我无法在命令行上运行可执行文件 Pedr Abc 07 MINGW64 c dev ls sqlite3 exe
  • Jenkins:如何在 Windows 从机中执行 shell 脚本

    我有一个 Windows 从机 安装了 bash 我正在尝试在其上运行 shell 脚本作为预构建步骤 关于我如何做到这一点有什么想法吗 您需要使用脚本作为参数来运行 bash bash yourscript
  • Android:如何在播放媒体(mp3)时在特定毫秒内显示文本

    我正在尝试做一个类似卡拉 OK 的应用程序 我想在某一毫秒到来时显示一个或多个单词 例如 1148 毫秒 gt 打印 尼古拉斯 1826 毫秒 gt 打印 是 2766 毫秒 gt 打印 旧 ms gt 显示 这是我的代码 包 com ex
  • 如何使用自定义比较器以不同的词汇顺序对数组进行排序?

    所以 我对 C 还很陌生 我正在尝试使用自定义比较器来订购数组 我创建了一个类 class MySorter IComparer public int Compare object x object y var chars jngmclqs
  • 从 numpy 数组中删除连续的 RGB 值

    我最初根据灰度图像的初始数组创建了一个子数组 从 numpy 数组中删除连续数字 https stackoverflow com questions 50743769 deleting consecutive numbers from a
  • 检查已安装的软件包,如果没有找到则安装

    我需要检查已安装的软件包 如果未安装则安装它们 RHEL CentOS Fedora 示例 rpm qa grep glibc static glibc static 2 12 1 80 el6 3 5 i686 如何在 BASH 中进行检
  • 使用模数按字母顺序对列表进行排序

    我在获取元素列表并按字母顺序对它们进行排序方面没有任何问题 但我很难理解如何使用模数来做到这一点 更新 这是按我的方式工作的代码 但是 我更喜欢下面提供的答案的可重用性 因此接受了该答案
  • 在 Bash 中监控 tomcat,直到它完成部署 war 或应用程序

    怎么可能Tomcat在 bash 脚本中进行监控以检测它是否完成了战争或应用程序的部署 应用场景 Tomcat 开始于systemd Tomcat 开始于catalina sh 使用 Tomcat 管理器 Tomcat从Eclipse启动
  • 正则表达式匹配bash变量

    我正在尝试修改 bash 脚本 当前脚本包含 print div class 1 div Where 1可能看起来像 Apprentice Historian Level 1 Historian Level 4 Master Histori
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI

随机推荐

  • 如何在 python 中使用 C 扩展来绕过 GIL

    我想在 Python 中跨多个内核运行一个 cpu 密集型程序 并试图找出如何编写 C 扩展来做到这一点 有这方面的代码示例或教程吗 您已经可以将一个 Python 程序分解为多个进程 操作系统已经将您的进程分配给所有核心 Do this
  • 如何在位图上绘制整个表单?

    我想在画布上绘制整个表单 包括其标题栏和框架TBitmap object GetFormImage很酷 但是有两个问题 它也不粉刷窗框 当表单隐藏时它不起作用 您有解决这些问题的想法吗 访问非客户区的关键是GetWindowDC http
  • jUnit不同情况下相同的异常

    我正在为构造函数编写 jUnit 测试 该构造函数解析字符串 然后检查许多内容 当数据错误时 对于每件事 都会抛出一些带有不同消息的 IllegalArgumentException 所以我想为它编写测试 但是我如何识别抛出了什么错误 我该
  • 我如何可以为 UINavigationBar 而不是 UITabBar 的条色调颜色变化设置动画?

    我正在我的应用程序中实现一个主题 但遇到了一个奇怪的错误 功能 由于某些奇怪的原因 我无法使用UIView animate在我的自定义 UITabBarController 类中 对 UITabBar 的颜色变化进行动画处理 但相同的代码在
  • MySQL 在一个查询中获取 Mindate 和 Maxdate

    如何仅使用一个sql查询获取mysql中的最大日期和最小日期 SELECT MIN date col MAX date col FROM table name
  • 持有多个锁的线程进入 wait() 状态。它会释放所有持有锁吗?

    我编写了这个程序来检查线程 t1 是否持有两个不同对象的锁 Lock class 和 MyThread class 使用 MyThread class wait 在 MyThread class 实例上进入等待模式 它不会释放 Lock c
  • 使用 v4 Fragments API 实现 ActionBar 选项卡

    我的应用程序当前使用 Fragments v4 兼容性包来支持 Android 版本一直到 1 6 这意味着我的所有片段都继承自兼容包的版本Fragment 我目前正在尝试重新设计应用程序的部分内容以利用 Honeycomb 功能 例如Ac
  • 使用 Kendo Grid 获取数据时日期格式发生变化

    我正在尝试使用一些参数获取数据并将其加载到剑道网格中 但是当我使用日期参数时 日期格式正在改变 因此在服务器端显示错误的日期 作为我使用的参数的示例 new Date April 01 2016 但在服务器端它变成 04 01 2016 这
  • Internet Explorer toDataURL() 替代方案?

    所以我需要保存在a上绘制的图像数据
  • C libm.a 编译时不需要链接

    我试图编译一个源文件 其中包括
  • RegEx:如果lookbehind显示小写,则删除换行符

    我正在 Notepad 中执行 CTRL H 查找和替换 我想找到所有换行符后跟小写字符 以便用空格字符替换它们 从而删除文本中不需要的换行符 Find r n A Z 0 9 代替 在此插入空格字符 确保您选择了 相符 and 正则表达式
  • boost是如何实现信号和槽的?

    要继续另一个问题 我们问这个 Boost是如何实现信号 槽机制的 See 信号和槽是如何在底层实现的 https stackoverflow com questions 1406940 how signal and slots are im
  • 什么是快照构建/源版本?

    什么是快照构建 源版本 具体到 JDK 7 快照版本供用户在平台仍在开发时下载和查看 http www oracle com technetwork java javase downloads ea jsp 142245 html http
  • R 以相似字符串开头的不同列组的行总和

    我对 R 还很陌生 这是我第一次敢在这里提问 我正在使用具有李克特量表的数据集 并且我想对不同组的列进行求和 这些列共享其名称中的第一个字符串 下面我构建了一个只有 2 行的数据框来说明我遵循的方法 尽管我希望收到有关如何编写更有效的方法的
  • Ajax 传递空值但控制器在 ASP.NET MVC 中获取 null

    我正在与ASP NET MVC并且发送的值有问题Ajax到我的控制器 假设我有SampleViewModel像这样 public class SampleViewModel private string firstName string E
  • Conda:将本地开发包安装到单个 conda 环境中

    如果我使用 virtualenv 我将激活项目的虚拟环境 然后安装我正在开发模式下开发的包 像下面这样 workon superbad pip install e fnawesome 这允许我的包裹fnawesome可以通过我的中的任何代码
  • C++中多重继承的限制

    C 中多重继承的限制是什么 即一个类可以继承多少个类 它是否依赖于实现 或者对多重继承中可以继承的类的数量是否有限制 它是实现定义的 C 11 给出了推荐的最小值实施数量标准部分 直接和间接基类 16 384 单个类的直接基类 1 024
  • JavaScript。无法在 safari 中打开新标签

    以下 JavaScript 可以在 Firefox Chrome 和 IE 中打开一个新选项卡 但它会在 Safari 中打开一个新窗口 javascript window open url blank opens new window i
  • Maven 插件自动生成 setter/getter?

    是否有一个 Maven 插件可以自动生成具有相应 JavaDocs 的 setter 和 getter 我知道 Eclipse Netbeans 会在您告诉它时执行此操作 然而 源代码最好只包含框架并让 Maven 或其他工具生成重复的内容
  • 如何在 Bash 中对数组进行排序

    我在 Bash 中有一个数组 例如 array a c b f 3 5 我需要对数组进行排序 不仅仅是以排序的方式显示内容 而是获取包含排序后的元素的新数组 新的排序数组可以是全新的 也可以是旧的 您实际上并不需要那么多代码 IFS n s