2017-10-14 312 views
0

我有一個問題。我想直接從文件解壓縮字符串。我有一個腳本在bash中創建另一個腳本。Gunzip from字符串

#!/bin/bash 


echo -n '#!/bin/bash 
' > test.sh #generate header for interpreter 
echo -n "echo '" >> test.sh #print echo to file 
echo -n "My name is Daniel" | gzip -f >> test.sh #print encoded by gzip string into a file 
echo -n "' | gunzip;" >> test.sh #print reverse commands for decode into a file 
chmod a+x test.sh #make file executable 

我想生成腳本test.sh這將是最短的腳本。我試圖壓縮字符串「我的名字是丹尼爾」,並直接寫入文件test.sh

但是,如果我運行test.sh我得到gzip:stdin有標誌0x81 - 不支持 你知道爲什麼我有這個問題嗎?

回答

1

gzip輸出是二進制的,所以它可以包含任何字符,因爲腳本是用bash生成的,它包含編碼的字符(echo $LANG)。

單引號之間出現問題的字符爲NUL 0x0,' 0x27和非ASCII字符128-256 0x80-0xff

解決方案可以使用ANSI C引號$'..'並轉義NUL和非ASCII字符。

編輯bash的字符串不能包含空字符:

gzip -c <<<"My name is Daniel" | od -c -tx1 

試圖創建ANSI字符串

echo -n $'\x1f\x8b\x08\x00\xf7i\xe2Y\x00\x03\xf3\xadT\xc8K\xccMU\xc8,VpI\xcc\xcbL\xcd\^C1\x00\xa5u\x87\xad\x11\x00\x00\x00' | od -c -tx1 

顯示字符串空字符後截斷。

最好的折衷辦法可以是使用base64編碼:

gzip <<<"My name is Daniel"| base64 

base64 --decode <<__END__ | gzip -cd 
H4sIAPts4lkAA/OtVMhLzE1VyCxWcEnMy0zN4QIAgdbGlBIAAAA= 
__END__ 

base64 --decode <<<H4sIAPts4lkAA/OtVMhLzE1VyCxWcEnMy0zN4QIAgdbGlBIAAAA=|gzip -cd 
0

的問題是在bash腳本存儲空字符(\ 0)。 空字符不能存儲在回顯和變量字符串中。它可以存儲在文件和管道中。

我想避免使用的base64,但我

printf "...%b....%b" "\0" "\0" 

固定它,我編輯與祝福十六進制編輯器腳本。它爲我工作:)

相關問題