【问题标题】:Simple map for pipeline in shell scriptshell脚本中管道的简单映射
【发布时间】:2012-12-03 17:53:27
【问题描述】:

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

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

【问题讨论】:

    标签: shell map pipeline


    【解决方案1】:

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

    $ 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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 当我知道什么是 XY 问题时,我非常兴奋。无论如何,我有一个巨大的 shell 和 perl 文件管道。第一个接受大约 8 个参数。然后它将它们传递给以下脚本。将其与保存路径的其他变量结合起来,我的最终目标是让整个管道有一个文件保存所有路径。然后它在需要某个路径时引用该文件。现在,路径是一个两列文本文件,我使用 awk + ​​regex 来查找变量,很像一个古老的地图结构。这能回答你的问题吗?
      • 这可能表明我是一个新手,我是在java中“长大”的。因此,我决定在 Java 程序员的思维方式中做得更好。它甚至可能不会更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多