为什么read命令会将所有单词读入名字

时间:2015-11-02 11:22:25

标签: bash

我的剧本:

#!/bin/bash

IFS=','

read a b c d e f g  <<< $(echo "1,2,3,4,5,6,7") # <- this could be any other commands, I am just making up a dummy command call

echo $a
echo $b
echo $c

我希望它输出

1
2
3

但它输出:

1 2 3 4 5 6 7
blank line
blank line

我做错了什么?

3 个答案:

答案 0 :(得分:3)

您应该像这样使用它:

IFS=, read a b c d e f g  <<< "1,2,3,4,5,6,7"

IFS的同一行使用read,以避免混乱当前的shell环境。

避免使用命令替换来捕获单个echo命令的输出。

如果您想在read中使用命令的输出,那么最好在bash中使用process substitution

IFS=, read a b c d e f g < <(echo "1,2,3,4,5,6,7")

答案 1 :(得分:1)

这有效:

#!/bin/bash
IFS=','
read a b c d e f g  <<< "$(echo "1,2,3,4,5,6,7")"
echo $a; echo $b; echo $c

请注意引用:"$( ...)"。没有它,字符串将被拆分并变为

$(echo "1,2,3,4,5,6,7")     ===>    1 2 3 4 5 6 7

1 2 3 4 5 6 7读取不产生分裂,因为IFS是,

当然,这也有效(IFS仅适用于执行的命令:read):

#!/bin/bash
IFS=',' read a b c d e f g  <<< "$(echo "1,2,3,4,5,6,7")"
echo $a; echo $b; echo $c

甚至更好:

#!/bin/bash
IFS=',' read a b c d e f g  <<< "1,2,3,4,5,6,7"
echo $a; echo $b; echo $c

您不需要执行回声&#34;得到一个变量,你已经拥有了它。

答案 2 :(得分:1)

从技术上讲,您的代码是正确的。 bash 4.3及更早版本中的here-string处理存在一个错误,它错误地将字拆分应用于命令替换的不带引号的扩展。以下内容可解决此问题:

# Quote the expansion to prevent bash from splitting the expansion
# to 1 2 3 4 5 6 7
$ read a b c d e f g <<< "$(echo "1,2,3,4,5,6,7")"

就像

一样
# A regular string is not split
$ read a b c d e f g <<< 1,2,3,4,5,6,7

bash 4.4中,这似乎是固定的:

$ echo $BASH_VERSION
4.4.0(1)-beta
$ IFS=,
$ read a b c d e f g <<< $(echo "1,2,3,4,5,6,7")
$ echo $a
1