使用 BASH 更新通过引用传递的数组

2023-12-12

我想编写一个函数,它采用数组变量名并更新内容。例如:

ARRAY1=("test 1" "test 2" "test 3")
toUpper ARRAY1

for arg in "${ARRAY1[@]}"; do
  echo "arg=$arg"
done

# output
arg=TEST 1
arg=TEST 2
arg=TEST 3

我对此进行了粗略的尝试,这需要输入数组的副本。使用间接引用,我可以创建输入变量的副本。数组的副本用于获取元素的计数。如果有更好的方法来做到这一点,请告诉我。

function toUpper() {
  local ARRAY_NAME=$1
  local ARRAY_REF="$ARRAY_NAME[@]"
  # use an indirect reference to copy the array so we can get the count
  declare -a ARRAY=("${!ARRAY_REF}")

  local COUNT=${#ARRAY[@]}

  for ((i=0; i<$COUNT; i++)); do
    local VAL="${ARRAY[$i]}"
    VAL=$(echo $VAL | tr [:lower:] [:upper:])
    echo "ARRAY[$i]=\"$VAL\""
    eval "$ARRAY_NAME[$i]=\"$VAL\""
  done
}

ARRAY1=( "test" "test 1" "test 3" )

toUpper ARRAY1

echo
echo "Printing array contents"
for arg in "${ARRAY1[@]}"; do
  echo "arg=$arg"
done

Using bash 4.3+你可以做

arr=( "test" "test 1" "test 3" )
toUpper() { declare -n tmp="$1"; printf "%s\n" "${tmp[@]^^}"; }

toUpper arr
TEST
TEST 1
TEST 3

Update:为了反映原始数组的变化:

toUpper() {
   declare -n tmp="$1"; 
   for ((i=0; i<"${#tmp[@]}"; i++)); do
      tmp[i]="${tmp[i]^^}"
    done;
}

arr=( "test" "test 1" "test 3" )
toUpper arr
printf "%s\n" "${arr[@]}"
TEST
TEST 1
TEST 3

Update2:这是一种让它工作的方法较旧的 BASH(4 之前)版本不带eval:

upper() {
   len=$2
   for ((i=0; i<len; i++)); do
      elem="${1}[$i]"
      val=$(tr '[:lower:]' '[:upper:]' <<< "${!elem}")
      IFS= read -d '' -r "${1}[$i]" < <(printf '%s\0' "$val")
   done;
}

arr=( "test" "test 1" "test 3" )
upper arr ${#arr[@]}
printf "%s\n" "${arr[@]}"
TEST
TEST 1
TEST 3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 BASH 更新通过引用传递的数组 的相关文章

  • Swift - 如何复制包含引用类型的数组

    我正在尝试复制数组及其值 为什么两个数组都引用同一个变量 您可以在 Playground 中尝试此操作 var view UIView view tag 1 var a UIView var b UIView a append view b
  • 为什么使用 reqwest 下载的 PNG 图像的字节与使用 Python 下载的不同?

    我正在尝试使用 reqwest 库来下载 PNG 文件 但是当我下载它时 我看到了其他编程语言的奇怪行为 例如 Python 例如 let content reqwest get https www google es images sea
  • 将数组传递给函数 - 指针与引用(C++ 与 C)

    我有一个关于将数组传递给函数的最佳实践的广泛问题 因此 过去当我用 C 语言编程时 我想要一个函数的输入是一个数组 我会声明该函数的输入参数是一个指针 这效果相对较好 然而 我已经开始更多地使用 C 进行编程 并试图确定将数组传递到函数中的
  • Swift:配对数组元素的最佳方法是什么

    我遇到了一个需要成对迭代数组的问题 最好的方法是什么 或者 作为替代方案 将数组转换为对数组 然后可以正常迭代 的最佳方法是什么 这是我得到的最好的 这个需要output成为一个var 而且它并不是很漂亮 有没有更好的办法 let inpu
  • 使用 Arrays.copyOf 复制不同类型的数组时出现问题

    我正在尝试创建一个方法 该方法几乎将任何内容作为参数 并返回带有某些分隔符的值的串联字符串表示形式 public static String getConcatenated char delim Object names String st
  • C 中带有指针的 For 循环

    我不明白指针在其中的作用for loop 什么是 p在下面的循环中做什么 char str 128 Some Text char p for p str p what does this mean p Code 其余的我都明白 但为什么不明
  • 使用脚本从网站中提取电子邮件地址

    给定一个网站 我想知道以编程方式和 或使用脚本的最佳程序是什么 以纯文本形式提取每个页面上存在的所有电子邮件地址 电子邮件受保护 cdn cgi l email protection从该链接和下面的所有站点 递归或直到某个固定深度 使用 s
  • 在 CodeIgniter 中将数组与 Calendar 类一起使用

    我正在尝试为我的日历应用程序创建一个相当复杂的数组 它应该包含日期 日期名称 类型 和事件 如果有 我已经创建了这个 dates 22 day gt Friday type gt weekday 23 day gt Saturday typ
  • 动态二维数组非连续内存C++

    假设我将二维数组的地址及其二维数组的行和列传递给函数 该函数会将二维数组的地址视为一维数组 例如 int Matrix 如果我执行下面的代码 int arr arr new int row for int i 0 i lt row i ar
  • 数组与列表的性能

    假设您需要一个需要频繁迭代的整数列表 数组 我的意思是非常频繁 原因可能有所不同 但可以说它位于大容量处理的最内层循环的核心 一般来说 人们会选择使用列表 List 因为它们的大小具有灵活性 最重要的是 msdn 文档声称列表在内部使用数组
  • 如何打印数组中每个单词之间的空格

    我记得在 w3school 上看到过一个函数 你可以打印出数组的所有单词并在它们之间添加一个空格 但无论我如何谷歌我都找不到它 其外观示例 function printWords var array Car Bus Motorcykle p
  • 多维数组内的移动

    我有一个用表格显示的数组 如何使用用户输入进行移动 目前 0 被分配给每个数组 但我计划为该数组分配其他值 我的问题是 如何使用用户输入在数组内向上 向下 向右 向左移动和对角移动 Array 0 gt Array 0 gt 0 1 gt
  • 如何在 JavaScript 中对关联数组进行排序?

    我需要为我的一个项目通过 JS 对关联数组进行排序 我发现这个函数在 Firefox 中运行得很好 但不幸的是它在 IE8 OPERA CHROME 中不起作用 无法找到使其在其他浏览器中运行的方法 或者找到另一个适合该目的的函数 我真的很
  • 如何扩展路径中的波形符(~)[重复]

    这个问题在这里已经有答案了 我有一个 shell 脚本 可以从用户那里获取目录路径 但我需要检查目录是否为空 如果用户将他的主路径与 而不是绝对路径 所以我无法检查它ls echo Specify your project root dir
  • Bash 中的动态变量名称

    我对 bash 脚本感到困惑 我有以下代码 function grep search magic way to define magic variable 1 ls tail 1 echo magic variable 1 我希望能够创建一
  • 为什么java中LinkedList没有initialCapacity?

    我想知道为什么LinkedList没有initialCapacity 我知道什么时候使用ArrayList什么时候LinkedList 定义集合最终大小的好习惯是 List
  • PHP 中只保留数组的前 N ​​个元素? [复制]

    这个问题在这里已经有答案了 有没有办法只保留数组的前 N 个 例如 10 个 元素 我知道有array pop 但是有没有更好 更优雅的方法呢 您可以使用array slice http php net array slice or arr
  • 在 macOS 上使用 find 时出现“非法选项”错误

    我试图列出末尾仅带有字母 R 的文件 我用了find在 macOS 终端中如下所示 find type f name R 但我收到消息说illegal option t 第一个参数find是它应该开始寻找的路径 路径 表示当前目录 find
  • Repa 数组上的并行 mapM

    在我最近的work https github com bgamari mixture model with Gibbs sampling 我一直在充分利用RVar http hackage haskell org packages arch
  • Bash 中单行 while 循环的语法

    我无法找到分号和 或大括号的正确组合 我想这样做 但作为命令行中的一句 while 1 do foo sleep 2 done while true do foo sleep 2 done 顺便说一句 如果您在命令提示符下将其输入为多行 如

随机推荐

  • java中的日历日期为yyyy-MM-dd格式

    如何将日历日期转换为yyyy MM dd format Calendar cal Calendar getInstance cal add Calendar DATE 1 Date date cal getTime SimpleDateFo
  • 为什么 pytesseract 不能识别单个数字?

    I am performing ocr on a site and specifically on these two images 我对 OCR 相当陌生 我使用以下内容 from PIL import Image import pyte
  • 如何使用 jQuery 增加数量字段的值?

    我有一个带有一些数量字段的表格 每一侧都有一个加号和减号
  • .NET 中的网络文件复制

    我有一个运行 Samba 共享的 Ubuntu 盒子 向所有人开放 我可以通过 ip 地址访问它 所以我知道我可以完全访问它 在我的应用程序中 我正在尝试以下操作 但它无法通过 IP 地址 仅 DNS 名称 工作 val ip addres
  • 有没有更好的方法来设置 JPanel 图形的初始位置?)

    在梁的第15章中Java 编程简介 第七版 他介绍了一个程序 可以在 JPanel 上制作一个 2 D 球 并通过单击放大 缩小按钮来放大它 我修改了程序 以便它还可以 1 在用户单击 选项 单击时放大 缩小球 2 允许您通过按下按钮来选择
  • 矩阵求逆的最快方法

    我想用反函数和很多函数处理图像 为了让代码快速运行 有谁能在 3 种反转方法中建议一种快速方法吗 double cvInvert const CvArr src CvArr dst int method CV LU CV LU 高斯消除并选
  • 如何将天数添加到字符串数据类型的 jtextfield 中给出的日期

    再会 我只是想问一下在给定日期中添加天数 我有一个 jtexfield txtStart 和另一个 jtexfield txtExpiry 我需要在 txtExpiry 中显示距 txtStart 中的日期 102 天后的日期 我正在使用
  • 如何在函数定义和函数调用中使用可变宏参数?

    我正在尝试使用宏根据宏的参数定义几个类似的函数 然而 结果函数需要采用的参数的数量和类型在所有函数中并不相同 但我还需要将函数的所有参数传递到函数体内的另一个可变参数函数中 我想要完成的事情的一个最小例子 define COMMAND CO
  • Checkstyle规则限制根包之间的交互(使用ImportControl?)

    如何创建 Checkstyle 规则来限制不同根包之间的交互 我有以下3个根包 models views controllers They are not就像是com mycompany myproject models 他们是根包 我想禁
  • 如何使用循环获取dir()中的值?

    为什么我无法使用循环获取 dir 中项目的值 for item in dir print item 它只是打印 builtins doc loader name package spec 那么 我如何使用循环来打印 item 中的值 即 m
  • Scala 中的 N 皇后

    def queens n Int List List Int Int def placeQueens k Int List List Int Int if k 0 List List else for queens lt placeQuee
  • 仅包含“div”的表格碎片

    当尝试抓取网页时 该表没有 tr 标签 并且是全部 div tags 我试图抓取的站点检查器如下所示 检查员截图 我希望能够从table row类 但刮擦永远不会返回任何东西 使用下面的代码 当我抓取 table header 要不就 pr
  • 列表与字典(最大大小、元素数量)

    我试图确定列表和字典的最大大小 以 RAM 为单位 我也很好奇每个元素 条目可以容纳的最大数量 以及每个条目的内存占用量 我的理由很简单 我和大多数程序员一样 有点懒 这是一种美德 当我编写程序时 我喜欢只编写一次 并尽可能使其面向未来 我
  • 将 8 字节数组转换为 Double

    谈论 Visual Basic 6 我能够找到如何将 Double 转换为 8 字节数组 但反之则不然 在我开始尝试编码之前 是否有一些例程可以执行此操作 例如链接问题中描述的 CopyMemory 在这种情况下可以使用 CopyMemor
  • 查找所有 k 大小的子集,其总和为 n 大小的重复未排序正整数袋

    请注意 这是必需的C NET 2 0项目 不允许使用 Linq 我知道这里已经提出了非常类似的问题 并且我已经生成了一些工作代码 见下文 但仍然希望获得有关如何在给定 k 和 s 条件下使算法更快的建议 这是我到目前为止所学到的 动态规划是
  • Puppeteer 未拾取对话框

    我正在尝试测试 Puppeteer 中的警报框 msg await page goto http localhost 8080 waitUntil networkidle2 await page eval value el gt el va
  • 将新数据插入表中

    我希望对以下问题有所帮助 请注意 此代码从我选择的日期生成一个系数 在本例中为 03 07 dmda 它给出的系数等于 15 55 在这种情况下 我想生成一个新表 其中有一列包含日期 另一列包含与这些日期对应的系数 对于列日期 只有以下日期
  • 使用 selenium python 从隐藏元素中获取文本

    我在 python 中使用 selenium 从网站上抓取信息 但是我遇到了一个问题 当我单击网站从表中获取更多行后 出现的行有一个hidden xs hidden sm我似乎无法找到获取这些元素的方法 我的代码如下 你有什么办法可以帮助我
  • PendingIntent.FLAG_IMMUTABLE 可以替换 PendingIntent.FLAG_UPDATE_CURRENT 吗?

    我正在处理PendingIntent with notification 在我的项目中 我一直在使用PendingIntent FLAG UPDATE CURRENT在一些代码中 它的定义如下 Flag表示如果所描述的PendingInte
  • 使用 BASH 更新通过引用传递的数组

    我想编写一个函数 它采用数组变量名并更新内容 例如 ARRAY1 test 1 test 2 test 3 toUpper ARRAY1 for arg in ARRAY1 do echo arg arg done output arg T