我正在尝试清理我编写的一些代码,以便在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
但是,inputfile不是一个数组,我找不到一个能够从输入文件中读取数组的包,而不使用行作为值而不是行的第一部分作为键,第二个part作为属于该键的值。我希望输入文件看起来像下面的文本(灰色),如果这意味着我不必逐行显式解析文件。
#!/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
事后看来,我正在寻找。
答案 0 :(得分:2)
如果我理解不将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" )
答案 1 :(得分:2)
怎么样:
#!/bin/bash
. <(
awk -F'=' '
BEGIN { print "declare -A ARRAY=(" }
{ print "[" $1 "]=\"" $2 "\"" }
END { print ")" }' inputfile )
echo "all keys : ${!ARRAY[@]}"
产生:
all keys : foo_bar2 foo_bar3 foo_bar1
工作原理:
AWK脚本生成行
declare -A ARRAY=(
[foo_bar1]="foo1/foo_bar1"
[foo_bar2]="foo2/foo_bar2"
[foo_bar3]="foo3/foo_bar3"
)
并且部分. <( ... )
执行进程替换以按预期分配数组。