예상되는 정수 표현식에 대한 솔루션 [닫기]

예상되는 정수 표현식에 대한 솔루션 [닫기]

따라서 이 코드를 Mac에서 실행하면 오류가 없으며 완벽한 출력이 제공됩니다. 하지만 Ubuntu 또는 CentOS에서 실행하면 다음 오류가 발생합니다. integer expression expected

 #!/bin/bash
if [ -f $1 ] ;
then
    sum=0
    echo "#Name Surname City Amount"
    while read -r LINE || [[ -n $LINE ]]; do
        firstName=$( echo $LINE | cut -d " " -f1)
        lastName=$( echo $LINE | cut -d " " -f2)
        city=$( echo $LINE | cut -d " " -f3)
        amount=$( echo $LINE | cut -d " " -f9)
        check=$( echo $amount | grep -c "[0-9]")
        if [ $check -gt 0 ]; then
            if [ $amount -gt 999 ] ; then
                state=$(echo $LINE | cut -d " " -f5)
                correctState=$(echo $state | grep -c "^N[YCEJ]")
                if [ $correctState -gt 0 ] ; then
                    echo "$firstName $lastName $state $city $amount"
                    sum=`expr $sum + $amount`
                fi

            fi
        fi
    done < $1
    echo ""
    echo "The sum is all printed amounts is $sum"
    echo ""
else
    echo "No file found"
fi

입력 파일:

#Name Surname City Company State Probability Units Price Amount
Tony Passaquale Edenvale "Sams_Groceries_Inc. NJ 90 800 4.78 3824
Nigel Shanford Atlanta Fulton_Hotels_Inc. GA 40 400 9.99 3996
Selma Cooper Eugene Cooper_Inns OR 40 1000 9.99 9990
Allen James San_Jose City_Center_Lodge CA 40 1000 9.99 9990
Bruce Calaway Irvine Penny_Tree_Foods CA 80 1000 4.99 4990
Gloria Lenares Chicago Cordoba_Coffee_Shops IL 60 200 9.99 1998
Wendy Leach New_York Gourmet_Imports NY 100 100 10 1000
Craig Flanders Omaha Fly_n_Buy NE 40 1200 9.49 11388
Montgomery Weissenborn Chicago Shariott_Suites_Hotels IL 60 400 7.98 3192
Shirley Brightwell San_Francisco Pacific_Cafe_Company CA 80 2900 1.75 5075
Roger Vittorio Cleveland National_Associa OH 40 1000 9.99 9990
Tony Passaquale Edenvale Sams_Groceries NJ 90 1000 2.29 2290
Montgomery Weissenborn Los_Angeles Shariott_Suites_Hotels CA 90 5000 1.49 7450
Michael Wiggum Los_Angeles Trader_Depot CA 70 800 2.5 2000
Edna Brock Raleigh Elliott's_Department_Stores NC 70 14400 1.78 25632
Gloria Lenares Chicago Cordoba_Coffee_Shops IL 90 600 8.99 5394
Montgomery Weissenborn Seattle Shariott_Suites_Hotels WA 90 400 8.99 3596
Beth Munin Seattle Little_Corner_Sweets WA 100 400 1.39 556
Tim Kelly New_York Nuts_and_Things NY 60 100 9.99 999
Bart Perryman San_Francisco Kwik-e-mart CA 90 40000 0.69 27600
Stacey Gordon Irvine Penny_Tree_Foods CA 70 200 12.96 2592
Heather Willis Atlanta Big_Chuck_Diners GA 80 400 4.99 1996
Tim Kelly New_York Nuts_and_Things NY 70 600 1.49 894
Ralph Khan New_York Gigamart NY 30 600 9.99 5994
Joshua Newsom New_York Trader_Depot NY 90 800 7.99 6392
Edna Brock Raleigh Elliott's_Department_Stores NC 90 9200 1.88 17296
Edna Brock Raleigh Elliott's_Department_Stores NC 100 4400 1.98 8712
Michael Wiggum Los_Angeles Trader_Depot CA 100 600 2.5 1500
Joshua Newsom New_York Trader_Depot NY 90 600 2.5 1500
Edna Brock Raleigh Elliott's_Department_Stores NC 100 8800 1.68 14784
Heather Willis Atlanta Big_Chuck_Diners GA 100 200 4.99 998
Beth Munin Seattle Little_Corner_Sweets WA 100 200 2.49 498
Shirley Brightwell San_Francisco Pacific_Cafe_Company CA 100 1200 1.89 2268
Tim Kelly New_York Nuts_and_Things NY 90 14000 2.29 32060

출력(예상)은 Mac에서만 작동합니다.

#Name Surname City Amount
Tony Passaquale NJ Edenvale 3824
Wendy Leach NY New_York 1000
Craig Flanders NE Omaha 11388
Tony Passaquale NJ Edenvale 2290
Edna Brock NC Raleigh 25632
Ralph Khan NY New_York 5994
Joshua Newsom NY New_York 6392
Edna Brock NC Raleigh 17296
Edna Brock NC Raleigh 8712
Joshua Newsom NY New_York 1500
Edna Brock NC Raleigh 14784
Tim Kelly NY New_York 32060

The sum is all printed amounts is 130872

출력(Ubuntu 또는 CentOSX에서)

   #Name Surname City Amount
: integer expression expected
: integer expression expected
: integer expression expected
./script.sh: line 13: [: 9.99: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected

The sum is all printed amounts is 0

답변1

이 가 보이면 : integer expression expected앞의 내용이 :다음으로 시작한다는 의미입니다.입력하다특징. 캐리지 리턴을 사용하면 터미널이 현재 줄을 후속 텍스트로 덮어쓰게 되므로 필드에 캐리지 리턴 1234␍위치 와 같은 내용이 포함되어 있으면 쉘이 오류 메시지를 표시 1234␍: integer expression expected하고 1234덮어쓰게 됩니다 : in.

입력 파일이 Windows 텍스트 파일이고 이것이 줄의 마지막 필드이기 때문에 캐리지 리턴이 발생합니다. Linux나 Cygwin에서 이 파일을 사용하려면 Unix 텍스트 파일로 변환해야 합니다. Windows 텍스트 파일은 두 문자 시퀀스 CR-LF(캐리지 리턴, 줄 바꿈)를 사용하여 줄 끝을 표시합니다. Unix 텍스트 파일은 단일 문자 LF를 사용합니다. 따라서 Linux는 Windows 텍스트 파일을 볼 때 각 줄이 CR 문자로 끝나는 것을 확인합니다. 이는 유효한 문자이지만 필수 문자인 경우는 거의 없으며 정수에서 유효한 문자가 아닙니다.

메시지에는 필드 9에 행이 있음이 표시됩니다 9.99: integer expression expected. 9.99예제 데이터에서 볼 때 이는 8번째 필드에서 예상되는 것으로 보이므로 행 중 하나에 잘못된 데이터가 포함되어 있습니다(이름 필드 중 하나에 허위 공백이 있을 수 있음).


스크립트가 너무 번거롭습니다. 인수가 일반 파일인지 확인하지 마세요. 이는 아무런 용도가 없으며(파일이 없으면 리디렉션이 실패합니다) 파이프를 입력으로 사용할 방법이 없습니다. 필드 구문 분석 에 사용하지 마십시오 cut. read수행할 수 있습니다(빈 필드가 없다고 가정). 이 || [[ -n $LINE ]]조각은 유용한 작업을 수행하지 않습니다(단, 입력이 유효한 텍스트 파일인지 확인하세요. 비어 있지 않은 유효한 텍스트 파일에서 마지막 문자는 LF입니다). 대신에 쉘 연산을 사용하십시오 expr.변수 대체에는 큰따옴표를 사용하세요.(여기서는 유효한 데이터가 중요하지 않지만 *누군가 현장에 글을 쓰면 어떤 일이 일어날지 생각해 보세요.) 테스트되지 않은 재작성:

#!/bin/bash
set -e
sum=0
echo "#Name Surname City Amount"
while read -r firstName lastName city f4 state f6 f7 f8 amount; do
    if [ "$amount" -gt 999 ] ; then
        case "$state" in
          N[YCEJ])
            echo "$firstName $lastName $state $city $amount"
            sum=$((sum + amount));;
        esac
    fi
done < "$1"
echo ""
echo "The sum is all printed amounts is $sum"
echo ""

awk 스크립트를 사용하면 더 쉬울 것입니다. 다시 말하지만, 테스트되지 않았습니다.

awk '
    $9 > 999 && $5 ~ /^[N[YCEJ]]$/ {
        print $1, $2, $5, $3, $9;
        sum += $9;
    }
    END { print "\nThe sum is all printed amounts is " sum }
' <"$1"

답변2

#!/bin/bash
if [ -f $1 ] ;
then
    sed 's/^M$//' $1 > $1.txt
    total=0
    amount=0
    echo "#Name Surname City Amount"
    while read -r LINE || [[ -n $LINE ]]; do

         firstName=$( echo $LINE | cut -d " " -f1)
            lastName=$( echo $LINE | cut -d " " -f2)
        city=$( echo $LINE | cut -d " " -f3)
        amount=$( echo $LINE | cut -d " " -f9)
        check=$( echo $amount | grep -c "[0-9]")
        if [ $check -gt 0 ]; then
           #echo $amount
           checkAmount=$( echo "$amount > 999" | bc)
           state=$(echo $LINE | cut -d " " -f5)
           correctState=$( echo $state | grep -c "^N[YCEJ]" )
            if [ $checkAmount -gt 0 ] &&  [ $correctState -gt 0 ]  ; then
                        echo "$firstName $lastName $state $city $amount"
                        total=`expr $total + $amount`
            fi
        fi
    done < $1
    echo ""
    echo "The sum is all printed amounts is $total"
    echo ""
    else
        echo "No file found"
fi

방금 모든 캐리지 리턴을 제거하고(확실하지 않음) 필요에 따라 작동하도록 할 수 있었습니다.

관련 정보