【问题标题】:Passing variable as index to bash array将变量作为索引传递给bash数组
【发布时间】:2013-02-09 10:22:42
【问题描述】:

我试图在这个论坛和其他论坛上找到答案。以下是一个 bash 脚本,它应该在 for 循环中运行一系列命令。我正在从文件中读取 2 列。第一列有一个文件名列表 (FARR),第二列是一个参数 - 处理中使用的数字 (NARR)。它将为 FARR 中的每个文件运行一组命令,并在“do”之后开始的命令中使用文件名和参数。除了 ${NARR[$N]} 没有将参数添加到行尾之外,一切都正常工作。此阶段参数为空。 使用 echo $NARR 会显示完整列表。所以数据在那里... 任何帮助将不胜感激。

#!/bin/bash

DIR='gauss_data/'
declare -i N=0
FARR=$(cat $DIR'all.dat' | awk '{if (NR!=1) print $1}')
NARR=$(cat $DIR'all.dat' | awk '{if (NR!=1) print $2}')
for f in $FARR;
do
    ./gauss_and_noise.py -i $DIR$f -o $DIR$f'.out' -d --save $DIR$f'.out.plot.png' --n0 ${NARR[$N]}
    let "N++"
done

【问题讨论】:

  • 您似乎对 Python 很熟悉。如果我是你,我会用 Python 重写这个 bash 脚本。
  • 提示:在 shebang 行下方添加 set -x 对调试 bash 脚本很有帮助。
  • 我本可以在 python 中做到这一点,但我正在自学 bash 脚本,这似乎是一个不错的选择。

标签: arrays bash variables awk


【解决方案1】:

你说NARR 是一个数组,但你给它的是一个字符串值

也许改成这个

NARR=($(awk 'NR>1 {print $2}' "$DIR"all.dat))

【讨论】:

    【解决方案2】:

    此外,要遍历数组,请使用以下语法:

    for f in "${FARR[@]}"
    

    【讨论】:

      【解决方案3】:

      您可以通过使用while 循环和read 命令来实现这一点。循环之前的read 用于消耗输入文件的第一行而不使用它。不需要数组;只需在阅读时使用每个输入行。

      dir='gauss_data'
      declare -i N=0
      {
          read
          while read f n rest; do
              ./gauss_and_noise.py -i "$dir/$f.out" -d \
                                   --save "$dir/$f.out.plog.png" --n0 $n
              ((n++))
          done
      } < $dir/all.dat
      

      【讨论】:

        猜你喜欢
        • 2013-01-27
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        • 2016-05-31
        • 2014-06-07
        • 2013-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多