나는 이런 문자열을 가지고있다
"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