Unix と Windows では、行末の形式が異なります。Unix の世界では、行は改行文字 (LF、ascii char 10) で終わります。Windows では、改行が続くキャリッジ リターン (CR、ASCII 文字 13) で行が終了します。
Windows の行末を持つファイルは、Unix ツールで作業する前に、Unix 形式に変換する必要があります。bc
そうしないと、あなたの場合のように、CR文字をジャンクと見なして文句を言うようなプログラムが表示されます。
ファイルを Unix 形式に変換するにdos2unix(1)
は、インストールされている場合は使用するか、代わりにそれを渡しますsed 's/^M//g'
(ただし、リテラル ^M を入力しないでください - Ctrl+V を押してから Ctrl+M を押します)。
では、なぜ^M
ですか?まあ、キャリッジ リターンは印刷できない文字です。印刷可能な表現はありません。便宜上、端末では^M
* と表示されます。では、なぜ表示されなかったのecho $values
ですか? 残念ながら、コマンド ライン引数の処理ではそれが削除されるため、表示されません。
また、便宜上、端末ではCtrl+V および Ctrl + 文字を使用して印刷できない文字を入力できます。Ctrl+V と Ctrl+M は^M
文字を生成しますが、カーソルを左右に動かすと、全体が 1 文字としてスキップされることがわかります。入力^
した後にM
. が表示されている間^M
、コマンド ライン プログラムは生データのみを認識し、実際のキャリッジ リターン文字を認識します。
なぜ 5E 4d 0a、つまり ^M は ASCII の 13 番目の文字なのですか?
hexdump
の出力を実行しました。これにより、a 、a 、および改行文字 (LF)echo "^M"
の 3 つの文字が生成されます。上記を参照してください。これはキャリッジ リターンとは異なります。^
M
末尾の記号 0a が . と表示されるのはなぜですか? . は 12 月で 2E です。16 進数の 5E は DEC で 94、4d は DEC で 77 です。
Hexdump は.
、キャリッジ リターンやライン フィード文字を含む、印刷できないすべての文字を文字として表示します。
*なぜ特に M なのですか? 規約では、ASCII コードに 64 を追加します。キャリッジ リターンは ASCII コード 13 (0x0D) です。64 を追加すると、大文字の M である 77 (0x4D) が得られます。完全なリストについては、このページを参照してください。