在“-u”模式下处理 bash 空数组的可靠的独立于版本的 (3.2 .. 4.4) 方式

2024-01-30

虽然建议的解决方案使用“set -u”进行 Bash 空数组扩展 https://stackoverflow.com/questions/7577052/bash-empty-array-expansion-with-set-u对我来说效果很好,事实证明数组处理在最近发布的 (2016/09/16) bash 4.4 中发生了变化(例如,在 Debian Stretch 中可用)。

$ bash --version | head -n1
bash --version | head -n1
GNU bash, version 4.4.0(1)-release (x86_64-pc-linux-gnu)

现在空数组扩展不会发出警告

$ set -u
$ arr=()
$ echo "${arr[@]}"

$ # everything is fine

相关问题中提出的解决方案在 bash-4.4 中失败:

$ set -u
$ arr2=()
$ arr2=( ${arr2[@] + "${arr2[@]}"} 'foo' )
bash: ${arr2[@] + "$arr2[@]"}: bad substitution

有没有人得到关于(或多或少)版本无关解决方案的建议,而无需对数组长度或 bash 版本进行额外检查? 我仍在亲自调查最新的 bash 更改

EDIT

由于我最初的问题似乎有些令人困惑,这里澄清了我试图实现的目标。 测试脚本:

#!/usr/bin/env bash
set -euo pipefail
bash --version | head -n1

arr=()

# some external environment variables are set / command line arguments passed to script
if test -n "${USE_EXTRA_ARGUMENT_1-}" ; then
  arr=( ${arr[@] + "${arr[@]}"} 'foo' )
fi

if test -n "${USE_EXTRA_ARGUMENT_2-}" ; then
  arr=( ${arr[@] + "${arr[@]}"} 'bar' )
fi

# just a dummy command
echo "${arr[@]-}"

Bash 4.3(Arch linux)运行:

$ USE_EXTRA_ARGUMENT_1=baz bash xxx.sh 
GNU bash, version 4.3.46(1)-release (x86_64-unknown-linux-gnu)
foo

Bash 4.4(Debian 延伸版)运行:

$ USE_EXTRA_ARGUMENT_1=baz bash xxx.sh
GNU bash, version 4.4.0(1)-release (x86_64-pc-linux-gnu)
xxx.sh: line 9: ${arr[@] + "${arr[@]}"}: bad substitution

或者我在使用 bash 数组时犯了严重错误?


之前的空间+是错的;你的意思是

arr2=( ${arr2[@]+"${arr2[@]}"} 'foo' )

不过,使用更简单+=操作员。

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

在“-u”模式下处理 bash 空数组的可靠的独立于版本的 (3.2 .. 4.4) 方式 的相关文章

  • StartCoroutine 被调用多次 (C# Unity)

    我正在 Unity 中创建一个弹出菜单选项 现在我的问题是我在 void update 中创建的协程被调用了很多次 我的意思是在我的 Unity 控制台上 Debug Logs 正在递增 它不应该正确 因为它已经是协程了 有人可以帮助我了解
  • 使用具有来自平面数字数组的最大和的子数组填充数组

    我需要填充一个数组 其中可能包含不确定数量的子数组 托盘 每个子数组的最大尺寸为 265 厘米 我有一个整数 包 的平面数组 需要在托盘中进行最佳排列 例如 50 厘米 45 厘米 30 厘米 如何动态创建一个系统来创建代表具有最佳空间优化
  • 当存储在变量中时,Git 提交消息变得混乱[重复]

    这个问题在这里已经有答案了 我有一个 Git 提交 其中有一个摘要 然后是一些描述 所以当我看到提交消息时git log format B n 1
  • 在php中循环多维数组并执行mysql插入(股票数据)

    我有一个多维数组 我希望循环遍历它并为数组中的值执行 mysql 数据库插入 我需要插入到 sql 查询中的数组值是 candles 0 complete candles 0 volume candles 0 mid h candles 0
  • SQLPlus 中的运行循环

    我制作了一个 bash 脚本 它通过 SQLPlus 连接到数据库并运行一个包含 For 循环的 SQL 脚本 如下所示 但是一旦运行它 它就会卡在循环的 BEGIN 中 如下所示 我尝试直接通过SQLPlus运行 结果是一样的 那么任何人
  • 循环遍历多维数组

    我正在使用 php 和 dropbox api 开发一个应用程序 并尝试循环遍历多维数组并输出到表中 到目前为止 这是我的代码
  • PHP 难以检查数组中的元素是否为整数类型

    我正在尝试检测一个或多个变量是否包含数字 我尝试了几种不同的方法 但并没有完全成功 这是我尝试过的
  • C 中每 N 个元素中出现次数最多的元素

    我有一个大小为 0 8388608 的大数组 A 其中包含 相对较小 的整数 A i 0 131072 我想找到每个 N 32 个元素中最常出现的元素 什么会更快 A 创建一个大小为131072的关联数组B 迭代32个元素 递增B A i
  • JavaScript 预分配数组未捕获 RangeError:数组长度无效

    我有一个小循环的代码 它抛出 Uncaught RangeError Invalid Array Length 我能够在 Google Chrome 控制台中重现它 const COUNT 100 000 000 const xValues
  • JavaScript 在对象中创建数组并将数据推送到数组

    我是编程新手 我正在尝试 React 并具有函数 addComment 当用户向新闻添加评论时执行该函数 此时我需要创建一个属性comments 数组 并分配或推送到该数组输入评论值价值 但现在我只重写了数组的 0 个元素 无法添加新元素
  • 根据 Google Apps 脚本中的另一个数组过滤数组

    我对 JavaScript 相当陌生 可能需要一些帮助来解决我在处理 Google Apps 脚本时遇到的问题 我打算做的是根据数组过滤数据 该数组是从特定工作表中的特定单元格中获取的 其中包含我不想保留在数据中的字符串元素 换句话说 包含
  • 元组/数组列表对

    我本质上是想创建一个配对列表 事实证明这是非常困难的 请注意 在任何人提到哈希表之前 都会有我不关心的重复项 例如 如果我这样做 b dog cat I get Name Value dog cat 这很好 但是 我无法添加类似的内容 b
  • 如何在原生 Swift 中实现以前称为 NSMutableOrderedSet 的可变有序集泛型类型?

    我正在尝试实现一个通用的可变有序集类型 它需要符合许多协议才能以与 Swift 中的数组和集合相同的方式运行 首先要实现泛型类型元素需要符合Hashable https developer apple com documentation s
  • Bash IF:多个条件

    我已经尝试让这件事工作几个小时 但我无法让它工作 if P SFTP a PORT 22 P FTPS PORT 990 a PORT 21 then 有人能帮我吗 我知道多个条件可以这样写 if P SFTP PORT 22 then 但
  • 将 SQL 中的数据存储在数组中

    我正在尝试将 sql 数据库中的数据存储到数组中 目前我有这个 query mysql query SELECT FROM InspEmail WHERE Company LIKE company while row mysql fetch
  • C++ 指针数组

    Code include stdafx h include
  • Bash:将输出传输到后台进程?

    我想将一个进程放入后台 然后多次将数据传递给它 例如 cat The command I want to write into cat pid Getting the process id of the cat process echo h
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 使用 php 和 symfony 从数组创建 Excel 文件

    我正在尝试使用 PHP 和 symfony 将数组导出为 XLS 文件 如下面的代码所示 创建 XLS 文件后 我只能获取数组的最后一行 并且它显示在文件的第一行中 似乎 lignes 变量没有增加 我不明白出了什么问题 有人可以帮忙吗 f
  • Powershell - 将字符串拆分为由开始和结束字符串划分的数组

    我有一个多行字符串 来自 json 例如 somekey somevalue somekey somevalue somekey somevalue somekey somenumber somekey null 我想将字符串拆分为一个数组

随机推荐