readarray的替代品,因为它不适用于mac os x

use*_*962 9 macos bash perl awk

我有一个varsValues.txt文件

cat varsValues.txt
aa=13.7
something=20.6
countries=205
world=1
languages=2014
people=7.2
oceans=3.4
Run Code Online (Sandbox Code Playgroud)

我想创建2个数组,变量和值.它应该包含

echo ${vars[@]}
aa something countries world languages people oceans

echo ${values[@]}
13.7 20.6 205 1 2014 7.2 3.4
Run Code Online (Sandbox Code Playgroud)

我用

Npars=7

readarray -t vars < <(cut -d '=' -f1 varsValues.txt)
readarray -t values < <(cut -d '=' -f2 varsValues.txt)

for (( yy=0; yy<$Npars; yy++ )); do
eval ${vars[$yy]}=${values[$yy]}
done

echo $people
7.2
Run Code Online (Sandbox Code Playgroud)

但我希望它没有readarray,它不适用于Mac(os x)和IFS(interfield separater).

还有其他方法吗?AWK?Perl的?我可以在我的bash脚本中使用它.

谢谢.

anu*_*ava 6

您可以使用额外的括号:

vars=( $(cut -d '=' -f1 varsValues.txt) )
values=( $(cut -d '=' -f2 varsValues.txt) )
Run Code Online (Sandbox Code Playgroud)

您可以添加前缀declare -abut 正如评论者指出的那样,这是多余的。

declare -a vars=( $(cut -d '=' -f1 varsValues.txt) )
declare -a values=( $(cut -d '=' -f2 varsValues.txt) )
Run Code Online (Sandbox Code Playgroud)


Joh*_*n B 6

您可以使用读取循环。

while IFS=\= read var value; do
    vars+=($var)
    values+=($value)
done < VarsValues.txt
Run Code Online (Sandbox Code Playgroud)


S. *_*Ahn 6

这是 awk 版本。请注意,这NPars不是硬编码的。

vars=($(awk -F= '{print $1}' varsValues.txt))
values=($(awk -F= '{print $2}' varsValues.txt))

Npars=${#vars[@]}

for ((i=0; i<$Npars; i++)); do
    eval ${vars[$i]}=${values[$i]}
done

echo $people
Run Code Online (Sandbox Code Playgroud)


小智 5

Mac 默认使用过时的 bash 版本(由于许可原因),缺少 readarray 命令。

这个解决方案最适合我(Mac 用户):

检查 bash 的版本(可能是 2007 年的版本 3)

bash --version
Run Code Online (Sandbox Code Playgroud)

下载最新版本的 bash

brew install bash
Run Code Online (Sandbox Code Playgroud)

打开一个新终端(这将加载新环境),然后检查 bash 的新版本(应该是版本 5 或更高版本)

bash --version
Run Code Online (Sandbox Code Playgroud)

检查 bash 的位置

which -a bash
Run Code Online (Sandbox Code Playgroud)

输出:

/usr/local/bin/bash
/bin/bash
Run Code Online (Sandbox Code Playgroud)

您可以看到现在有两个版本的 bash。通常,这两个路径都在您的 PATH 变量中。

检查路径变量

echo $PATH
Run Code Online (Sandbox Code Playgroud)

在此变量中, 应该/usr/local/bin/bash位于 之前/bin/bash。shell 按照 PATH 变量中出现的顺序搜索可执行文件,并获取找到的第一个可执行文件。

使用此命令时请确保使用 bash shell(而不是 zsh)。

尝试使用 readarray 命令,例如通过命令替换将ls 命令的输出重定向到readarray命令以生成包含当前文件夹文件名列表的数组:

readarray var < <(ls); echo ${var[@]}
Run Code Online (Sandbox Code Playgroud)

另外,如果您想编写 bash 脚本,请确保使用正确的 Shebang:

#!/usr/local/bin/bash
Run Code Online (Sandbox Code Playgroud)