Unix shell中for循环的问题

Unix shell中for循环的问题,unix,shell,Unix,Shell,我根据以下代码获取以空格分隔的标题列表: TITLES=`awk -F'|' '{print $1}' titles.txt | cut -d'=' -f2 | sort 然后我在for循环中使用该列表打印结果: for T in $TITLES do echo "$T" done 问题是,当一个标题有多个单词并且单词之间用空格隔开时,我的for循环会将它们作为单独的内容打印出来 我尝试使用sed为每个标题添加双qout,但这只会导致循环以双引号打印每个单词,而不是将两个单词标题一

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

TITLES=`awk -F'|' '{print $1}' titles.txt | cut -d'=' -f2 | sort
然后我在for循环中使用该列表打印结果:

for T in $TITLES
do
     echo "$T"
done
问题是,当一个标题有多个单词并且单词之间用空格隔开时,我的for循环会将它们作为单独的内容打印出来

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


如何解决这个问题?

您是否尝试过在$TITLES周围加引号

TITLES=`awk -F'|' '{print $1}' titles.txt | cut -d'=' -f2 | sort`
for T in "$TITLES"
do
    echo "$T"
done
或者您可以在以下时间使用:

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

你试过在$TITLES周围加引号吗

TITLES=`awk -F'|' '{print $1}' titles.txt | cut -d'=' -f2 | sort`
for T in "$TITLES"
do
    echo "$T"
done
或者您可以在以下时间使用:

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

一种方法是设置IFS:

IFS='
'
for T in $(awk -F'|' '{print $1}' titles.txt | cut -d'=' -f2 | sort)
do
     echo "$T"
done
这将IFS设置为刚刚换行(在打开和关闭单引号之间有一条换行)

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


如果这样做,在完成循环后,您几乎肯定会希望将IFS设置回原来的值。

一种方法是设置IFS:

IFS='
'
for T in $(awk -F'|' '{print $1}' titles.txt | cut -d'=' -f2 | sort)
do
     echo "$T"
done
这将IFS设置为刚刚换行(在打开和关闭单引号之间有一条换行)

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


如果您这样做,您几乎肯定会希望在完成循环后将IFS设置回原来的值。

您可以在不使用外部工具的情况下使用shell

while IFS="|" read -r a b
do
    IFS="="
    set -- $a
    T=$2
    echo "T is $T"
    unset IFS
done <"file"
而IFS=“|”读取-r a b
做
IFS=“=”
一套--$a
T=2美元
回声“T是$T”
取消设置IFS

完成您可以在不使用外部工具的情况下使用外壳

while IFS="|" read -r a b
do
    IFS="="
    set -- $a
    T=$2
    echo "T is $T"
    unset IFS
done <"file"
而IFS=“|”读取-r a b
做
IFS=“=”
一套--$a
T=2美元
回声“T是$T”
取消设置IFS

对不起,我错过了一次机会。再试一次。这可能在unix控制台中工作,但我需要在脚本中运行它,而不是echo,我最终将在该循环中使用一个变量,并在循环外使用它。这个场景现在不适合我。我所做的只是复制你的代码并修复它,以便它正确处理空格。如果你的代码没有达到你想要的效果,也许你可以在问题中告诉我们你真正想要的是什么。还有,如何在循环内使用循环外使用的变量?我添加了一个不同的建议。对不起,我错过了一个do。再试一次。这可能在unix控制台中工作,但我需要在脚本中运行它,而不是echo,我最终将在该循环中使用一个变量,并在循环外使用它。这个场景现在不适合我。我所做的只是复制你的代码并修复它,以便它正确处理空格。如果你的代码没有达到你想要的效果,也许你可以在问题中告诉我们你真正想要的是什么。另外,如何在循环内使用循环外使用的变量?我添加了一个不同的建议。请提供titles.txt中的几行内容?我理解这个问题有些困难。当标题用空格分隔,并且一些标题有多个单词时,您如何区分标题和单词?能否从titles.txt中为我们提供几行内容?我理解这个问题有些困难。当标题用空格分隔时,有些标题有不止一个单词,你如何区分标题和单词?这很有效!!!好的,在循环完成后,我如何将IFS设置回旧值?通常是空格制表符和换行符,因此可以显式设置,或者可以在循环之前将旧值存储在临时变量中,然后在循环后从temp变量恢复IFS的值。使用
IFS=$'\n'
可以提高可读性,这很有效!!!好的,在循环完成后,我如何将IFS设置回旧值?通常是空格制表符和换行符,因此可以显式设置,或者可以在循环之前将旧值存储在临时变量中,然后在循环后从temp变量恢复IFS的值。可以使用
IFS=$'\n'