shell脚本中管道的简单映射

时间:2012-12-03 17:53:27

标签: shell map pipeline

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

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

2 个答案:

答案 0 :(得分:3)

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

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

然而,这听起来像XY problem。你能给我们一个关于你实际做了什么的例子(代码中)吗?当我看到grep | awk | sed的长条纹时,通常会有一种简化方法。例如,通过参数传递数据比通过stdout | stdin?

传递更好

换句话说,我质疑你的陈述&#34;我觉得它会更好......&#34;

答案 1 :(得分:3)

您可以创建env var assignments文件并根据需要提供该文件,即。

$ 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