echo -e 在 shell 脚本中工作不正常
echo -e working improperly in shell script
我正在为文件使用以下脚本,其格式如下所示:
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 }')
line2=$(echo "$line" | awk '{print }')
arr=$(echo $line2 | tr "|" "\n")
for x in $arr
do
echo -e "$x \t$line1\n"
done
done < FBC.txt
但是我得到的结果混合了 variables.Something,例如:
abefgch
abc hig
yxxncf
xxndbs
xbs shc
xbehcs
xbs xoc
尝试将您的意图解释为针对 POSIX sh 的正确脚本(如果您实际上针对的是 ksh、bash 或 zsh,则可以使用数组而不是覆盖参数列表):
#!/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 变量。 ("line2" 变量后面的内容进入 "rest" 变量,该变量未被使用。
IFS='|'
之后确保 for x in $line2
按管道字符拆分。
- 使用
printf
而不是 echo
可确保您的脚本不依赖于偏离 POSIX 规范的行为。
你完全可以在 awk 中完成:
#!/usr/bin/awk -f
{
n = split(, a, "|");
for (i = 1; i <= n; i++)
printf("%s %s\n", , a[i])
}
我正在为文件使用以下脚本,其格式如下所示:
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 }')
line2=$(echo "$line" | awk '{print }')
arr=$(echo $line2 | tr "|" "\n")
for x in $arr
do
echo -e "$x \t$line1\n"
done
done < FBC.txt
但是我得到的结果混合了 variables.Something,例如:
abefgch
abc hig
yxxncf
xxndbs
xbs shc
xbehcs
xbs xoc
尝试将您的意图解释为针对 POSIX sh 的正确脚本(如果您实际上针对的是 ksh、bash 或 zsh,则可以使用数组而不是覆盖参数列表):
#!/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 变量。 ("line2" 变量后面的内容进入 "rest" 变量,该变量未被使用。IFS='|'
之后确保for x in $line2
按管道字符拆分。- 使用
printf
而不是echo
可确保您的脚本不依赖于偏离 POSIX 规范的行为。
你完全可以在 awk 中完成:
#!/usr/bin/awk -f
{
n = split(, a, "|");
for (i = 1; i <= n; i++)
printf("%s %s\n", , a[i])
}