shell中的for循环问题

时间:2009-12-12 21:39:01

标签: unix shell

我根据以下代码获得了以空格分隔的标题列表:

TITLES=`awk -F'|' '{print $1}' titles.txt | cut -d'=' -f2 | sort

然后我在for循环中使用该列表打印出结果:

for T in $TITLES
do
     echo "$T"
done

问题在于,当一个标题有多个单词且单词用空格分隔时,我的for循环会将它们作为单独的东西打印出来。

我尝试使用sed为每个标题添加双qoutes,但这只是导致循环用双引号打印每个单词而不是两个单词标题一起打印。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

您是否尝试过在$ TITLES附近加注?

TITLES=`awk -F'|' '{print $1}' titles.txt | cut -d'=' -f2 | sort`
for T in "$TITLES"
do
    echo "$T"
done

或者您可以使用while:

awk -F'|' '{print $1}' titles.txt | cut -d'=' -f2 | sort | while read T
do
    echo "$T"
done

答案 1 :(得分:1)

一种方法是设置IFS:

IFS='
'
for T in $(awk -F'|' '{print $1}' titles.txt | cut -d'=' -f2 | sort)
do
     echo "$T"
done

这会将IFS设置为换行符(打开和关闭单引号之间有换行符。)

我知道这在bash中有效,但我不确定它对其他shell有多可移植。

如果你这样做,你几乎肯定想要在完成循环后将IFS设置回旧值。

答案 2 :(得分:1)

你可以在没有外部工具的情况下使用shell

while IFS="|" read -r a b
do
    IFS="="
    set -- $a
    T=$2
    echo "T is $T"
    unset IFS
done <"file"