2016-11-24 96 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') 

失去了空,因爲你發現了。