파일의 행을 입력으로 산술적으로 평가할 수 없습니다.

파일의 행을 입력으로 산술적으로 평가할 수 없습니다.

그래서 저는 각 줄에 정수가 포함된 파일을 허용하는 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

관련 정보