for循环不是设计为循环线。 for循环遍历“单词”或“fields”。
循环线的惯用方法是使用while循环与read相结合。
ioscan -m dsf | while read -r line
do
printf '%s\n' "$line"
done
请注意,由于管道,while循环在子shell中。在bash中,您可以通过使用进程替换来解决此问题。
while read -r line
do
printf '%s\n' "$line"
done <
for循环使用$ IFS(内部字段分隔符)变量中的字符作为分隔符分隔值循环。通常$ IFS包含空格,制表符和换行符。这意味着for循环将循环遍历“单词”,而不是在线上。
如果您坚持使用for循环来循环使用,则必须将$ IFS的值更改为只换行。但是,如果这样做,您必须保存$ IFS的旧值,并在循环后恢复,因为许多其他事情也取决于$ IFS。
OLDIFS="$IFS"
IFS=$'\n' # bash specific
for line in $(ioscan -m dsf)
do
printf '%s\n' "$line"
done
IFS="$OLDIFS"
或者,您可以使用subshell来包含对$ IFS的更改:
(
# changes to variables in the subshell stay in the subshell
IFS=$'\n'
for line in $(ioscan -m dsf)
do
printf '%s\n' "$line"
done
)
# $IFS is not changed outside of the subshell
也可以看看: