#!/bin/bash
list="john,do not target
martin,unknown"
for i in $list; do
name=`echo ${i} | cut -f1 -d','`
value=`echo ${i} | cut -f2 -d','`
echo $value
done
由于do not target之间的白色,我为上面得到的输出是
do
not
target
unknown
我想要的输出是:
do not target
unknown
4条答案
按热度按时间igetnqfo1#
不需要
cut
(外部进程);你可以在Bash中这样做:但是,除非
list
来自您无法控制的输入(就格式而言),否则在Bash中有更好的方法来表示此类数据,例如关联数组。诚然,关联数组并不保持顺序;如果需要的话,你可以有一个额外的(整数索引的)数组,从数字Map到名称。
x6yk4ghg2#
让
read
为我们进行拆分(通过IFS
):**注意:**这有一个额外的好处,即消除了当前代码每次通过循环时产生的4个子进程
这产生:
bxjv4tth3#
正如其他答案中所述,
bash
具有处理这类问题的工具,并且您不必(通常也不应该)调用外部实用程序。为了回答这个问题,或者如果您坚持使用cut
,我建议如下使用:这将输出:
qc6wkl3g4#
这里已经有了很好的答案,但是花一点时间看看你在做什么。
这不是一个列表,它是一个字符串-一个字符串,你在循环中使用,不加引号
我很确定这不是你想要的。当你说
$list
的时候,你得到的输出和在一个不带引号的echo
中使用它的输出是一样的-所以你的意思是
所以第一次i是“john,do”。第二次是“not”。等等。
一个简单的
read
将做你想做的事情,我想。所以,我会说,为了清晰地复制你所要求的内容,使用markp-fuso's solution,尽管对于你发布的片段所暗示的实际文字结果,我同意M. Nejat Aydin's-使用简单的
cut
。