"정수 표현식이 필요합니다" 오류

"정수 표현식이 필요합니다" 오류

다음 스크립트를 실행하고 있습니다.

#!/bin/bash
# This script acts as a simple calculator for add, subtract, multiply and divide.
echo "Kindly ENTER 'a' to select for addition"
echo "Kindly ENTER 's' to select for subtraction"
echo "Kindly ENTER 'm' to select for multiplication"
echo "Kindly ENTER 'd' to select for division"
read oper
echo "Please ENTER any number of your choice"
read no1
echo "Please ENTER another number of your choice"
read no2
if [ $oper -eq a ]; then 
echo "Your addition result is: $(($no1 + $no2))" 
elif [ $oper -eq s ]; then 
echo "Your subtraction result is: $(($no1 - $no2))"
elif [ $oper -eq m ]; then 
echo "Your multiplication result is: $(($no1 * $no2))"
elif [ $oper -eq d ]; then 
echo "Your division result is: $(($no1 / $no2))"
else echo "Your selection from the begining was incorrect"
fi

오류/출력은 다음과 같습니다.

./test2.sh: line 12: [: m: integer expression expected
./test2.sh: line 13: [: m: integer expression expected
./test2.sh: line 14: [: m: integer expression expected
./test2.sh: line 15: [: m: integer expression expected
Your selection from the begining was incorrect

이유는 무엇일까요?

답변1

-eq연산자는 정수 값과 관련된 관계 연산자입니다. 이러한 연산자는 값이 정수가 아닌 이상 문자열 값에 작동하지 않습니다.

따라서 =두 문자열 피연산자의 값이 같은지 확인하려면 which를 사용하십시오.

답변2

다른 사람들이 말했듯이 -eq정수에서만 작동하는 비교 연산자입니다. 껍데기시험유틸리티에는 다양한 목적을 위한 여러 피연산자가 있습니다. 그것들을 더 잘 이해하는 것이 도움이 될 수 있습니다.

파일 테스트 연산자

  • -b- 파일이 블록 특수 파일이면 참
  • -c- 파일이 문자 특수 파일인 경우 True입니다.
  • -d- 파일이 디렉터리이면 참
  • -e- 파일이 존재하면 true
  • -f- 파일이 "일반 파일"이면 True입니다.
  • -g- 파일에 SGID 비트가 설정되어 있으면 참입니다.
  • -h- 파일이 심볼릭 링크이면 참
  • -L- 파일이 심볼릭 링크이면 참
  • -p- 파일이 FIFO이면 참
  • -r- 파일에 대한 읽기 권한이 있으면 True입니다.
  • -S- 파일이 AA 소켓이면 true입니다.
  • -s- 파일 크기가 0보다 크면 True입니다.
  • -u- 파일에 setuid 플래그가 설정되어 있으면 참입니다.
  • -w- 파일에 대한 쓰기 권한이 있는 경우 True입니다.
  • -x- 파일에 대한 실행 권한이 있으면 True입니다.

문자열 연산자(정수와 작동하지만 문자열로 처리)

  • =- 왼쪽 문자열이 오른쪽 문자열과 같으면 참
  • !=- 왼쪽 문자열이 오른쪽 문자열과 같지 않으면 참입니다.
  • -z- 문자열 길이가 0이면 참
  • -n- 문자열 길이가 0이 아니면 참
  • string- 문자열이 존재하면 true

관계 연산자(문자열에서는 작동하지 않음)

  • -eq- 왼쪽 정수가 오른쪽 정수와 같으면 참입니다.
  • -ne- 왼쪽 정수가 오른쪽 정수와 같지 않으면 참입니다.
  • -gt- 왼쪽 정수가 오른쪽 정수보다 크면 참입니다.
  • -ge- 왼쪽 정수가 오른쪽 정수보다 크거나 같으면 참입니다.
  • -lt- 왼쪽 정수가 오른쪽 정수보다 작으면 참입니다.
  • -le- 왼쪽 정수가 오른쪽 정수보다 작거나 같으면 참입니다.

부울 연산자

  • !- 표현식이 거짓이면 참
  • -o- 왼쪽 식이나 오른쪽 식 중 하나라도 참이면 참
  • -a- 좌변과 우변이 모두 참이면 참

산술 연산자(셸 산술 확장 또는 내부 expr)

  • +- 연산자의 양쪽에 값을 추가합니다.
  • -- 왼쪽 정수에서 오른쪽 정수를 뺍니다.
  • *- 연산자의 양쪽 값을 곱합니다.
  • /- 왼쪽 정수를 오른쪽 정수로 나눕니다.
  • %- 왼쪽 정수를 오른쪽 정수로 나누고 나머지를 반환합니다.
  • =-오른손을 왼손에 할당
  • ==- 두 정수가 같으면 참
  • !=- 두 정수가 같지 않으면 참

다른

  • -t- 파일 설명자가 열려 있고 터미널과 연결되어 있으면 참입니다.

답변3

교육 목적으로 계산기를 코딩하는 또 다른 방법입니다. 그냥 마음 편하게 물어봐.

#!/bin/bash
declare -A operations=([addition]=+ [subtraction]=- [multiplication]='*' [division]=/)
PS3="Which calculation do you want? "
select ans in "${!operations[@]}" quit; do
    [[ $ans == quit ]] && break
    [[ -z $ans ]] && continue
    read -p "Enter two numbers separated by a space: " -r a b x
    echo "Your $ans result is: $(( a ${operations[$ans]} b ))"
done

  1. PS3select프롬프트에 사용되는 bash 변수 입니다 . 예를 들어 유효하지 않은 응답을 입력한 경우 select가 필요한 만큼 자주 다시 프롬프트를 표시하므로 이는 echo보다 낫습니다.
  2. is를 인용하면 '*'파일 이름 목록으로 확장되는 것을 방지할 수 있습니다. 바라보다파일 이름 확장자bash 매뉴얼에서. 돌이켜 보면 이것은 아마도 필요하지 않았을 것이며 매뉴얼에서 곧 명확한 설명을 찾을 수 없었습니다. 일반적으로 bash를 사용하면 의심스러운 경우 따옴표를 추가하는 것이 일반적으로 올바른 접근 방식입니다.

답변4

@steeldriver가 쓴 =것처럼 -eq.

관련 정보