0

GNU bash,版本 4.3.42(1)-release

试图区分空字符,但 bash 似乎没有将空字符保留在变量中。

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

有什么我做错了吗?

4

1 回答 1

1

Bash确实嵌入了二进制零:

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')

如您所见,丢失空值。

于 2016-11-24T08:17:34.813 回答