在bash shell脚本中设置列的变量

时间:2015-04-01 06:27:14

标签: bash shell scripting

运行时的脚本

./program < "$1" | awk -F '!' '{print $3 $4, $5, $6, $7}

返回值

900 200 30 400 5
51 31 2 3 4

如何为每一行的colummns设置变量 我试过了

LINE=`./program < $1`
for i in $LINE
do
$LINE | awk -f '!' | read a b c d e <<< "$(echo $i | cut -f4 -d:}'

但无论我怎么做,我似乎都无法将值变为变量

2 个答案:

答案 0 :(得分:1)

您可以使用流程替换为awk的每一行输出读取这些值:

while read -r a b c d e; do
   echo "<$a><$b><$c><$d><$e>"
done < <(./program < "$1" | awk -F '!' '{print $3 $4, $5, $6, $7}')

事实上,由于awk仅打印由!分隔的列,因此您甚至可以完全删除awk:

while IFS='!' read -r a b c d e; do
   echo "<$a><$b><$c><$d><$e>"
done < <(./program < "$1")

答案 1 :(得分:0)

for i in $LINE

将遍历LINE中的标记。您可以修改IFS以使令牌等于一行,但您也可以

./program <"$1" |
while IFS='!' read -r a b c d e f g _; do
    echo "<$c$d><$e><$f><$g>"
done

您尝试的其他问题:

  • LINE不是一个好的变量名。使用小写变量名;大写应视为shell的特殊变量保留。

  • 您的进程替换尝试在循环外使用循环变量$i,但这是不可能的;它将是未定义的。

  • LINE不是命令名称,因此其标准输出无法通过管道传输到awk。要将字符串传递给Awk,请执行echo "$LINE" | awk或仅在Bash中使用此字符串:<<<"$LINE" awk

  • 您有一个双重定向到read。它无法读取管道和此处字符串的标准输入;这里的字符串将获胜。但在这种情况下,因为read位于管道的末尾,所以它将在子shell中运行,并在子shell退出时丢失其值。 (你可以在Bash中避免这种情况。请参阅http://mywiki.wooledge.org/BashFAQ/024进行讨论。)

  • 您在$(echo ... | cut ... }

  • 中的括号不匹配
  • 你应该在echo "$i"中引用字符串(尽管在这个孤立的情况下,它实际上可能有效)。通常,除非您明确要求shell对变量的值执行通配符扩展和标记拆分,否则应该对其进行双引号。

  • 没有done关闭for ...; do阻止。