如何从Bash中的程序读取输入作为重定向?

时间:2015-01-26 18:00:33

标签: bash

我尝试从bash中的文件读取输入,但由于CSV中的标题行,因此想要丢弃文件的第一行。 tail -n+2 "${csv}"单独使用,但在使用<时出现错误:

syntax error near unexpected token `-n+2'

我尝试工作的代码是:

while IFS=, read c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 c22 c23 c24
do
    description[$i]="${c3}"
    current_ip[$i]="${c10}"
    new_ip[$i]="${c12}"
    new_netmask[$i]="${c13}"
    new_gateway[$i]="${c14}"
    i=$i+1
done < tail -n+2 "${csv}"

有人可以帮助提供< tail -n+2 "${csv}"的工作表格并解释解决方案吗?

2 个答案:

答案 0 :(得分:4)

这里简单的答案是使用process substitution

while ... done < <(tail -n+2 "$csv")

这是有效的,因为<(tail)被shell替换为一个文件名,该文件名通过命名管道连接到tail的输出,或者在支持它的平台上,{{1}别名。

因此,在运行时,这将变成类似(伪代码):

/dev/fd

...或(如果尝试为POSIX sh编写此代码,或者没有类似功能的shell,则可能会执行此操作):

tail -n+2 "$csv" >/dev/fd/63 &
while ... done < /dev/fd/63

...虽然你的shell不需要用于创建FIFO的临时目录的开销,但这比使用tempdir=$(mktemp -t -d csvpipe.d.XXXXXX) mkfifo "$tempdir/csvpipe.tmp" tail -n+2 "$csv" >"$tempdir/csvpipe.tmp" & while ... done <"$tempdir/csvpipe.tmp" rm -rf "$tempdir" 更安全,并且比固定/硬编码的临时文件更安全名。

答案 1 :(得分:1)

而不是使用tail,只需直接从文件中读取,但使用复合命令({...}和两个read来丢弃前两行。

{ read; read;
  while IFS=, read ...; do
      ...
  done
} < "$csv"