0

我正在处理主要由 shell 和 Perl 文件组成的管道,所有这些文件都将参数(路径)传递给下一个。我决定使用单个文件来存储所有路径并为每个文件调用它会更好。问题是我使用 awk 来抓取每个文件开头的文件,结果证明是很多重复。

我的问题是:我不知道是否有办法将键值对存储在文件中,以便 shell 可以原生地对键执行操作并返回值?它需要访问外部文件,因为管道使用许多脚本,并且特定文件中的映射会导致参数被传递到任何地方。是否有一些我不知道的小怪癖在外部文件上执行地图功能?

4

2 回答 2

3

在 bash 中,有mapfile, 但这会将文件的行读入数字索引数组。要将空格分隔的文件读入关联数组,我会

declare -A map
while read key value; do
  map[$key]=$value
done < filename

然而,这听起来像是一个XY 问题。你能给我们一个你实际在做什么的例子(用代码)吗?当我看到 grep|awk|sed 的长管道时,通常有一种简化的方法。例如,通过参数传递数据是否比通过 stdout|stdin 传递更好?

换句话说,我质疑你的说法“我认为它会更好......”

于 2012-12-03T18:10:53.543 回答
3

您可以制作一个环境变量分配文件并根据需要获取该文件,即。

$ cat myEnvFile
path1=/x/y/z
path2=/w/xy
path3=/r/s/t
otherOpt1="-x"

在您的脚本中,您可以使用. myEnvFile相同功能的任何一个或更详细的版本sourc myEnvFile(假设 bash shell),即

$cat myScript
#!/bin/bash
. /path/to/myEnvFile
# main logic below
 ....
# references to defined var
if [[ -d $path2 ]] ; then
     cd $path2
else
     echo "no pa4h2=$path2 found, can't continue" 1>&1
     exit 1
fi

根据您描述问题的方式,这应该可以正常工作,并为您的所有变量设置提供一站式服务。

IHTH

于 2012-12-04T00:44:37.970 回答