arrays - 从 bash 中的输入文件中读取数组

标签 arrays bash

我正在尝试清理我为在 bash(版本 4.2.46)中的数组中的文件上运行一些程序而编写的一些代码。在我正在清理的脚本中,我使用一个数组,其中文件名作为键,它们的相对路径作为值(我知道下面的代码中没有扩展名,这些是由程序单独假设和/或添加的)。这个数组可能会变得非常大,因此我想将它与我的其余代码分开,以提高程序的可读性。

我目前用来读取输入文件的脚本如下:

#!/bin/bash

mapfile -t FILE <$1

declare -A fileArray

while read line; do
    key=$(cut -d'=' -f1 <<< $line)
    value=$(cut -d'=' -f2 <<< $line)
    fileArray[$key]=$value
    echo "Key $key : Value ${fileArray[$key]}"
done <$1

echo "all keys : ${!fileArray[@]}"

这需要一个输入文件,读取行,在定界符“=”处剪切它,将结果字符串作为键和值传递给 MyArray,最后回显 myArray 的键和值以检查数组是否实际用作预期的。它是做什么的。输入文件包含以下文本(灰色):

foo_bar1=foo1/foo_bar1
foo_bar2=foo2/foo_bar2
foo_bar3=foo3/foo_bar3

但是,输入文件不是数组,我找不到能够从输入文件中读取数组而不使用行作为值而不是行的第一部分作为键和第二部分的包部分作为属于该键的值。我希望输入文件看起来像下面的文本(灰色),如果这意味着我不必逐行显式解析文件。

#!/bin/bash
declare -A fileArray=(
[foo_bar1]='foo1/foo_bar1'
[foo_bar2]='foo2/foo_bar2'
[foo_bar3]='foo3/foo_bar3'
)

你能帮我清理一下用于解析数组的 miniscript 还是给我指点一个为我做这件事的包?

提前致谢。

编辑: 我发现 source可以从输入文件中读取数组(和任何其他变量),而无需明确地解析它。这会产生以下脚本,作为 myScript.sh input.sh 运行:

#!/bin/bash
source $1
declare -p fileArray

事后看来,这正是我要找的。

最佳答案

如果我理解您的要求,拆分 line 的权利到键和值并直接使用它们,您可以将自定义分隔符与 IFS 一起使用通过将其设置为 =并读取两个值来设置它

#!/usr/bin/env bash

declare -A fileArray

# Setting IFS value as '=' to delimit read on this character
while IFS== read -r key value; do
    fileArray["$key"]="$value"
done < file

declare -p fileArray

它产生如下输出,我希望这是你想要做的。

declare -A fileArray=([foo_bar2]="foo2/foo_bar2" [foo_bar3]="foo3/foo_bar3" [foo_bar1]="foo1/foo_bar1" )

关于arrays - 从 bash 中的输入文件中读取数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49626708/

相关文章:

php - 包含带有数字键的数组失败

bash - libpqxx 配置找不到用于本地安装 PostgreSQL 的 libpq-fe.h

linux - 根据日期/时间创建目录并将文件复制到其中?

bash 脚本 : use command output to dynamically create menu and arrays?

node.js - 从作为子进程运行的脚本将 Node 作为后台进程运行

arrays - grep输出到数组

ios - Swift:像 Lua 一样快速从数组中删除元素

Javascript 在对象之间移动数组项

ios - 比较两个集合中的对象

c++ - 为什么 std::extent 不能处理对像运算符 sizeof 这样的数组的引用?