2016-11-24 76 views
0

GNU bash的内部版本42年3月4日(1)-release使用削减空字符变量

试图deliminate一个空字符,但庆典似乎并没有让空字符变量。

$ echo -e 'hello\0goodbye' > testlist 
$ cat testlist | cut -d '' -f1 
hello 
$ foobar=$(echo -e 'hello\0goodbye'); echo "$foobar" | cut -d '' -f1 
hellogoodbye 

有什么我做错了吗?

+0

为什么你认为'“”'是空字符? –

+1

@Miati,是的。根据我的经验,shell不能在变量中保留空字符。其他命令如'find'和'xargs'没有问题。但是,shell甚至可以将空字符作为字符串的一部分来处理,如您在此命令行的输出中所见:'echo -e'A \ 0B'| od -tx1' – Jdamian

+2

@Miati,我猜bash不能在变量中保留空字符,因为它被用作C中的字符串结束符分隔符。 – Jdamian

回答

1

猛砸确实嵌入二进制0:

echo -e 'hello\0goodbye' | od -xc 

给出:

0000000  6568 6c6c 006f 6f67 646f 7962 0a65   
     h e l l o \0 g o o d b y e \n 

虽然我个人比较喜欢\x00符号。

这是cut程序,它是问题。因此,您可以使用awk语言。例如:

awk -F '\0' '{print $1}' testlist 

(注:无需cat) 和:

foobar='hello\0goodbye' 
echo -e "$foobar" | awk -F '\0' '{print $1}' 

均可以得到:

hello 

然而,\0扩展为空字符串(如记录在man bash),以便

foobar=$(echo -e 'hello\0goodbye') 

失去了空,因为你发现了。