問題の入力

問題の入力

私はこれをbashスクリプトに持っています

DAY2="20130605"<Cr>
echo  "This is yesterday date:"$DAY2"end"

出力が次の理由は何ですか?キャリッジリターン文字があるようですが、DAY2どこから出てきますか?

ends is yesterday date:20130605

答え1

Enterを押すと、カーソルが行の先頭に戻ります。出力文字列は次のとおりです。

    This is yesterday date:20130605<Cr>end

端末がクリックされない限り<Cr> カーソルを行の先頭に戻し、そこにある文字を上書きします。

つまり、「Thi」が「end」に置き換えられ、次のようになります。

    ends is yesterday date:20130605

実行する操作を実行するには、スクリプトは次のようになります。

   variable="text"
   echo "Some sentence $variable"

どちらが出力されるのか

   Some sentence text

誤ったキャリッジリターンがある場合^MviBruceが言ったように)とマークする必要があります。

ソリューション1

キャリッジリターンや他の印刷されない文字を削除する最善の方法は、単一文字のすべてのインスタンスを削除するオプションを指定してtrコマンドを使用することです。ここで、キャリッジリターン文字のエスケープシーケンスは次のとおりです。-d\r

    tr -d '\r'

これにより、すべてのキャリッジリターンが削除されます。スクリプトで次を実行して、キャリッジリターンのすべてのインスタンスを削除し、元のスクリプトファイルを上書きします。

    tr -d '\r' yourscript.bash > temp
    mv temp yourscript.bash

ソリューション2

または、viスクリプトを開くときは、次のように入力します。

    :%s/\r//g
    :wq

文書からキャリッジリターンを削除するには、文書を保存してください。

答え2

キャリッジリターンを示す場合は、<Cr>最初の行の末尾からキャリッジリターンを削除します。あなたができることは次のとおりです。

sed -i '1s/\r//' script.sh

スクリプトからキャリッジリターンを表示するには、次のコマンドを実行します。

od -c script.sh | grep --color=yes '\r'

答え3

問題のbashスクリプトを使用またはvi確認してください。vim無効なキャリッジリターンは、「^ M」(カラット、em)の2文字のシーケンスで表示される必要があります。 hjklを使用してカーソルをキャリッジリターンに移動し、「x」をクリックして削除し、「:wq」をクリックして終了しますvi

私の考えでは、誰かがファイルをWindowsコンピュータに移動し、メモ帳またはワードパッドで編集してからLinuxに戻った場合、誤ったキャリッジリターンがファイルに表示されるようです。

答え4

キャリッジリターン文字がどのように生成されるかを正確に話すことは困難です。

スクリプトが他のスクリプトまたはアプリケーションによって生成された場合は、バグまたは意図的な事故の可能性があります。

CRファイルを編集する人が誤って挿入を引き起こしたキーの組み合わせを押した可能性があります。

例:

  • vim : Ctrl-v Ctrl-m
  • emacs: Ctrl-q Ctrl-m
  • 他にもたくさんあります。

コードに改行がないなど、問題を引き起こす可能性がある他の文字もあります。これにより、スクリプトを実行したりコードをコンパイルしたりすると、奇妙なエラーが発生します。

私は通常この機能vimを頻繁に使用して設定します(トグルできるキーの組み合わせがあります):

match Error /[^ -~\t]/

つまり、ASCIIとwithを使用して、<space>通常は赤の背景に白いテキストなどを除くすべてのコンテンツを強調表示します。~tabError

コードファイルの場合、通常はデフォルトで開いたままにします。


ターミナルでは、キャリッジリターンは通常カーソルを行の先頭に移動させるので、印刷時に改行が発生するまでその行の既存のテキストを上書きします。

たとえば、

#!/bin/bash

for i in {1..100}; do
    printf "We are now at %3d%%\r" "$i"
    sleep .1
done

printf "\nAll done.\n"

\rprintf、結果、<CR>またはキャリッジリターンを使用するとき。 、結果、または改行文字を
\n使用するとき。printf<LF>

関連情報