echo -e在shell脚本中工作不正常

时间:2015-04-28 17:41:40

标签: shell echo

我正在使用以下脚本来生成具有如下格式的文件:

    abc efg|hig
    yxf xnc
    xbs xnd|shc|ehc|xoc

我希望输出像这样:

    abc efg
    abc hig
    yxf xnc
    xbs xnd
    xbs shc
    xbs ehc
    xbs xoc

,脚本如下:

    while read line
    do
    line1=$(echo "$line" | awk '{print $1}')
    line2=$(echo "$line" | awk '{print $2}')
    arr=$(echo $line2 | tr "|" "\n")
    for x in $arr
    do
    echo -e "$x \t$line1\n"
    done
    done < FBC.txt

但是我得到的结果混合了两个变量。如:

    abefgch
    abc hig
    yxxncf
    xxndbs
    xbs shc
    xbehcs
    xbs xoc

2 个答案:

答案 0 :(得分:0)

此处尝试将您的意图解释为针对POSIX sh的正确脚本(如果您实际上是针对ksh,bash或zsh,则可以使用数组而不是覆盖参数列表):< / p>

#!/bin/sh
set -f

while unset IFS; read -r line1 line2 rest; do
  IFS='|'
  for x in $line2; do
    printf '%s \t%s\n' "$x" "$line1"
  done
done <FBC.txt

重要说明:

  • set -f使用可将文件匹配为通配符的数据使其安全。
  • unset IFS在第一个read将输入字段分隔符设置为其默认值之前,按空格或制表符分割line1和line2变量。 (&#34; line2&#34;变量后面的内容进入&#34; rest&#34;变量,未使用)。
  • 在此之后
  • IFS='|'确保for x in $line2按管道字符拆分。
  • 使用printf而不是echo可确保您的脚本不依赖于与POSIX规范不同的行为。

答案 1 :(得分:0)

你可以在awk中完全完成:

#!/usr/bin/awk -f
{
    n = split($2, a, "|");
    for (i = 1; i <= n; i++)
        printf("%s %s\n", $1, a[i])
}