ファイルの行を入力として算術的に評価することはできません。

ファイルの行を入力として算術的に評価することはできません。

だから私は各行に整数を含むファイルを許可するbashスクリプトを書いています、そして、各行のこれらの整数をローマ数字に変換する関数を書いています。これを別のファイルに書き込む必要があります。これを行うには)>)。ほとんどの操作はSubValueとRomanCon関数によって実行され、RomanConはファイルから読み取った行を繰り返しローマ数字に変換しますが、subvalueはデフォルトで整数値をローマ数字に置き換えます。コマンドラインから直接整数を入力すると、これらの両方がうまく機能します。ただし、ファイル入力から読み取ろうとすると、ファイルの行が純粋に整数で構成されていても、予想される整数式が引き続き表示されるため、機能しません。二重かっこ(())とは異なる強制型-iを試してみましたが、それでも望ましい効果が得られませんでした。

ありがとう

#!/bin/bash
#https://www.linuxjournal.com/content/converting-decimals-roman-numerals-bash
#https://opensource.com/article/21/3/input-output-bash
#https://phoenixnap.com/kb/bash-read-file-line-by-line
#https://www.tutorialspoint.com/linux_admin/linux_admin_reading_and_writing_to_files.htm
#https://github.com/joric/interviewbit/blob/master/scripting/regex-and-functions/convert-integer-to-roman-number.md

SubValue()
{
  # add $2 to romanvalue and subtract $1 from decvalue

  romanvalue="${romanvalue}$2"
  decvalue=$(($decvalue - $1 ))
}


RomanCon()
{
    decvalue=$1
    while [ "$decvalue" -gt 0 ] ; do
        if [ "$decvalue" -ge 1000 ] ; then
            SubValue 1000 "m"
        elif [ "$decvalue" -ge 900 ] ; then
            SubValue 900 "cm"
        elif [ "$decvalue" -ge 500 ] ; then
            SubValue 500 "d"
        elif [ "$decvalue" -ge 400 ] ; then
            SubValue 400 "cd"
        elif [ "$decvalue" -ge 100 ] ; then
            SubValue 100 "c"
        elif [ "$decvalue" -ge 90 ] ; then
            SubValue 90 "xc"
        elif [ "$decvalue" -ge 50 ] ; then
            SubValue 50 "l"
        elif [ "$decvalue" -ge 40 ] ; then
            SubValue 40 "xl"
        elif [ "$decvalue" -ge 10 ] ; then
            SubValue 10 "x"
        elif [ "$decvalue" -ge 9 ] ; then
            SubValue 9 "ix"
        elif [ "$decvalue" -ge 5 ] ; then
            SubValue 5 "v"
        elif [ "$decvalue" -ge 4 ] ; then
            SubValue 4 "iv"
        elif [ "$decvalue" -ge 1 ] ; then
            SubValue 1 "i"
        fi
    done
    echo $romanvalue
}

file=$1
while read -r line; do
    RomanCon $line
done <$file

現在、コマンドライン引数を使用してスクリプトを実行しています。

./roman.sh rome.txt

はい、ファイルコンポーネントへの書き込みが完了していないことがわかりましたが、実行するたびに出力され続けるため、これまでは動作しませんでした。

: integer expression expected

: integer expression expected

: integer expression expected

: integer expression expected

したがって、これらの入力を取得する方法がわかりません(このファイルには整数が含まれています。例:

1111
2345
789
905

ベストアンサー1

入力にDOS形式のテキストファイルのデータが含まれている場合、通常はスクリプトでこれらのエラーが発生します。 Unixシェルスクリプトで読み取ると、これらのファイルの各行にはテキスト(たとえば)が続き、1111その後にキャリッジリターン(新しい行をエンコードするDOSテキストファイルの一部)が続きます。キャリッジリターンはlineループの変数として読み込まれるデータの一部であるため、後でコード内の値を整数として使用することはできません。

入力内容をUnixテキストファイルに変換するには、このユーティリティを使用しますdos2unix

コードのもう一つの問題は、romanvalue変数がますます多くのローマ数字に連続的に関連付けられていることです。メインループが繰り返されるたびにリセットする必要があります。

コードと入力データを変更すると、次は与えられた入力を使用するスクリプトの出力になります。

mcxi
mmcccxlv
dcclxxxix
cmv

おすすめ記事