컷에서 얻은 숫자를 비교하는 Bash 스크립트

컷에서 얻은 숫자를 비교하는 Bash 스크립트

나는 이런 문자열을 가지고있다

"Hello catch these numbers 20 30"

나는 가지고있다:

NUMBER_ONE=$(echo "$line" | cut -d' ' -f5)
NUMBER_TWO=$(echo "$line" | cut -d' ' -f6)

비교할 때 오류가 발생합니다 if [ "$NUMBER_ONE" -gt "$NUMBER_TWO" ];. 정수 표현식이 필요합니다. 어떻게 해결할 수 있나요?

답변1

변수에 다음이 line포함되어 있다고 가정합니다.정확히그러면 표시되는 내용은 큰따옴표를 포함하여 $NUMBER_TWO입니다 . 30"이것은 분명히 정수가 아닙니다.

대신에,

line='"Hello catch these numbers 20 30"'

if [[ $line =~ ([[:digit:]]+)" "([[:digit:]]+) ]]; then
    NUMBER_ONE=${BASH_REMATCH[1]}
    NUMBER_TWO=${BASH_REMATCH[2]}

    if (( NUMBER_ONE > NUMBER_TWO )); then
        echo NUMBER_ONE is greater than NUMBER_TWO
    else
        echo NUMBER_ONE is not greater than NUMBER_TWO
    fi
fi

이는 정규식을 사용하여 공백으로 구분된 두 개의 (양수) 정수를 숫자의 하위 문자열과 일치시킨 다음 비교를 수행합니다. 다음 큰따옴표는 30일치하지 않습니다.


표준 도구 상자의 도구를 계속 사용하려면 변수 할당 시 변수에서 숫자가 아닌 모든 항목 제거를 사용하세요 tr. 이전 코드를 약간 수정하세요.

NUMBER_ONE=$(cut -d' ' -f 5 <<<"$line" | tr -dc '[:digit:]' )
NUMBER_TWO=$(cut -d' ' -f 6 <<<"$line" | tr -dc '[:digit:]' )

아니면 나중에 대체품을 사용하거나 bash,

NUMBER_ONE=$(cut -d' ' -f 5 <<<"$line" ); NUMBER_ONE=${NUMBER_ONE//[![:digit:]]/}
NUMBER_TWO=$(cut -d' ' -f 6 <<<"$line" ); NUMBER_TWO=${NUMBER_TWO//[![:digit:]]/}

음수를 처리해야 하는 경우 빼기 기호를 제거해서는 안 됩니다(그리고 위 첫 번째 스니펫의 정규식 일치에서는 초기 빼기 기호도 허용해야 합니다).

답변2

아래 스크립트를 사용해보십시오. 작동합니다.

NUMBER_ONE=`sed 's/"//g'  o.txt| awk '{print $(NF-1)}'`
NUMBER_TWO=`sed 's/"//g'  o.txt| awk '{print $NF}'`

if [[ $NUMBER_ONE -gt $NUMBER_TWO ]]; 
then 
echo "$NUMBER_ONE is greater than NUMBER_TWO"; 
else 
echo "NUMBER_ONE is equal or less than NUMBER_TWO";


fi

관련 정보