从bash

时间:2018-04-03 09:32:55

标签: 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

但是,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

事后看来,我正在寻找。

2 个答案:

答案 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"
)

并且部分. <( ... )执行进程替换以按预期分配数组。