我的剧本:
#!/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
我做错了什么?
答案 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