2017-11-06 17 views
3

私は次のスクリプトがありますLinuxの猫のインラインファイル

#!/bin/bash 
cat << EOF 
A^@B^AC^B 
EOF 

  • '^ @' =小数点値0
  • '^ A' =十進値1を
  • '^ B' =小数点値2

ので、ファイルの外観このようなS:

xxd main.sh 
00000000: 2321 2f62 696e 2f62 6173 680a 0a63 6174 #!/bin/bash..cat 
00000010: 203c 3c20 454f 460a 4100 4201 4302 0a45 << EOF.A.B.C..E 
00000020: 4f46 0a         OF. 

私はスクリプトを実行すると、小数点以下の値0と1が消えるように見える:

./main.sh | xxd 
00000000: 4142 4302 0a        ABC.. 

私の質問は、なぜでしょうか?

文字 'A'の後に10進値0、その後に 'B'、10進値1、続いて 'C'、10進値2が続きます。

答えて

2

理由は2つのようです。

まず、あなたが拡張(S)を避けるために、here-documentに単語 /区切り文字を引用符で囲む必要があります注意してください。

単語はヒアドキュメントのすべてのラインが施されている、引用符で囲まれていない場合には文字列\ newlineは無視され、 '\'、 '$'、 '' 'の文字を引用するためには' \ 'を使用する必要があります。だから、

、あなたはこのようにそれを書いた場合:

#!/bin/bash 
cat <<"EOF" 
A^@B^AC^B 
EOF 

あなたはNULL(\0)を除くすべての文字を保持します。

どちらの変数でもNULL文字を使用することはできません。(this answerを参照)の引数を使用することはできません。

はパイプ/ファイルでNULLを使用することができます。したがって、あなたのhere-documentのコンテンツをエンコードして、それをフライでデコードすることができます(たとえば、xxd)。

+0

ありがとう、私は 'cat'の代わりに' echo -e'を使ってヌル文字を含める必要があると思います。 –

+0

'printf'(例えば、' printf '\ 0 \ 01 \ xCA \ xFE' | hd')を使うこともできます。 'echo'を使うなら、' -n'も必ず付け加えてください。 – randomir