6

キャラクターに問題があります。dosとunixの間の変換の問題だと思います。

浮動小数点値である変数があります。echoコマンドで印刷すると、次のようになります。

0.495959

しかし、bcコマンドを使用してその値を操作しようとすると(bcコマンドの記述方法がわかりません)。

echo $mean *1000 |bc

私は得る:

(standard_in) 1 : illegal character: ^M

.shファイルですでにdos2unixコマンドを使用しています。私の変数が^M文字を持っているからだと思います(echoコマンドでは出力されません)

このエラーを取り除くにはどうすればよいですか?

4

7 に答える 7

13

私は手元に Cygwin を持っていませんが、通常の Bash では、tr -dコマンドを使用して指定された文字を取り除くことができ、$'...'表記法を使用してコマンドライン引数で奇妙な文字を指定できます (通常の一重引用符で囲まれた文字列のようなものです)。ただし、C/Java/Perl などのようなエスケープ シーケンスをサポートしています)。したがって、この:

echo "$mean" * 1000 | tr -d $'\r' | bc

echoからへの途中で改行を削除しますbc

あなたは実際にこれを実行したいかもしれません:

mean=$(echo "$mean" | tr -d $'\r')

$mean内部の改行を削除するように変更されるため、後でそれを使用するコマンドで心配する必要はありません。

(ただし、最初に設定するコードを確認することも価値があります$mean。とにかく、どのようにし$meanてキャリッジ リターンが含まれることになるのでしょうか?おそらくそれを修正できます。)

于 2011-11-29T19:59:46.463 に答える
2

ご存知のように、cygwinでWindowsのものを実行すると、厄介な副作用が1つあります。cygwinbash変数でWindowsプログラムの出力をキャプチャすると、プログラムによるCR出力もキャプチャされます。

d2uを適切に使用することで、問題を回避できます。たとえば、

runtime="`mediainfo --Inform='Video;%Duration%' ${movie} | d2u`"

(d2uがないと、$ {runtime}の最後にCRが追加されるため、たとえば「bc」にフィードしたときに問題が発生します。)

于 2012-03-19T22:17:32.037 に答える
2

これは機能します:

${mean/^M/}

Ctrl-V に続けて Ctrl-M を入力すると、^M を取得できます。または、代わりに:

${mean/$(printf "\r")/}

@ruakhの方法と比較したこの方法の利点は、ここでは bash ビルトインのみを使用していることです。2 番目はサブシェル内で実行されるため、1 番目の方が高速になります。

$mean を "unixize" したいだけの場合:

mean="${mean/^M/}"

編集:さらに別の方法があります:

${mean/$'\r'/}

于 2011-11-30T14:25:24.827 に答える
1

たぶん、DOSではなくUNIX形式でスクリプトを保存する必要があります。

于 2011-11-29T19:41:07.460 に答える
0

これを試して:

echo `echo $mean` *1000 |bc

エコーが実際にそれを印刷していない場合は、機能するはずです。

于 2011-11-29T19:43:30.637 に答える
0

他の人が指摘しているように、これは Windows の行末の問題です。問題を解決するには多くの方法がありますが、問題は、そもそもなぜこれが起こったのかということです。

私はこれがいくつかの場所で起こっているのを見ることができます:

  • これは Cygwin の起動時に設定された WINDOWS 環境変数です。これらの変数は、最後に CRLF を取得することがあります。これはこの 1 つの変数に特有の問題だとおっしゃっていましたが、どこに設定されているかは明記されていませんでした。

  • このファイルは、メモ帳Winpadなどの Windowsテキストエディタを使用して編集しました。

プログラムの編集にテキストエディタを使用しないでください。プログラムエディタを使用してください。VI が気に入った場合は、Windows で利用でき、Cygwin (および他のすべての Unix ベースのプラットフォーム) で利用できるVIMをダウンロードしてください。VIM が適していない場合は、よりグラフィカルなベースのNotepad++を試してください。これらのエディターはどちらも行末の問題を処理し、Windows で Unix の行末を持つスクリプトを作成したり、Cygwin で Windows の行末を持つファイルを作成したりできます。


  • VIM を使用している場合は、次のようにして行末を変更し、設定することができます。

    • 現在のファイルで終わる行を表示するには:set ff?、コマンド モードで次のように入力します。
    • Unix の行末を設定するには:set ff=unix、コマンド モードで入力します。
    • Windows の行末を設定するには:set ff=dos、コマンド モードで入力します。
  • メモ帳++を使用する場合

    • [編集] --> [EOL 変換] メニュー項目に移動して、現在の行末設定 (強調表示されていないもの) を確認して変更できます。
    • Notepad++ で Unix の行末をデフォルトとして使用するには、[設定] --> [設定] メニュー項目に移動します。[ダイアログ] ボックスで、[新しいドキュメント/既定のディレクトリ] タブを選択します。[新しいドキュメント] セクションの一部である [形式] セクションで、目的の行末を選択します。警告:オプションとして選択しないでください。それはMacでも機能しません。Mac をお持ちの場合は、 を選択しますMacUnix
于 2011-11-30T14:44:17.897 に答える
0

^M次の行を示すために改行 ( ) 文字と共に Windows で使用されるキャリッジ リターン文字です\nただし、UNIX の世界ではそれが行われてbashいないため、at は特殊文字として扱われず、構文が壊れます。あなたがする必要があるのは、多くの方法のいずれかを使用してその文字を削除することです. dos2unixたとえば、ツールは便利です。

于 2011-11-29T19:46:21.353 に答える