我正在尝试清理我为在 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
事后看来,这正是我要找的。p>
最佳答案
如果我理解您的要求,不拆分 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/