저는 스크립트의 인수($1, $2, $3)를 사용하여 기본 계산을 수행하는 calc.sh라는 스크립트를 작성하려고 합니다. 예를 들어, ./calc.sh 10 / 5의 결과로 2를 얻고 싶습니다.
내가 시작한 방법은 다음과 같습니다.
if [ $2 -eq "+" ] ; then res=`expr $1 + $3` ; echo "$res" ; fi
하지만 작동하지 않습니다. 다음과 같은 결과가 나타납니다. Line 2: [+: 정수 표현식이 필요합니다.
이제 비교를 위해 ==를 사용하고 /를 제외한 모든 항목에서 잘 작동합니다. 이제 코드는 다음과 같습니다:
if [ $2 == "+" ] ; then res=`expr $1 + $3` ;
elif [ $2 == "-" ] ; then res=`expr $1 - $3` ;
elif [ $2 == "x" ] ; then res=`expr $1 \* $3` ;
elif [ $2 == "/" ] ; then res=`expr $1 \/ $3` ;
else res=`Operación no válida` ;
fi ; echo "$res"
하지만 을 시도하면 다음과 같은 메시지 ./calc.sh 10 / 5
가 표시됩니다. "라인 4: 10/5: 구문 오류: 잘못된 산술 연산자(오류 요소는 "\5")... 아아, 이것을 입력하면서 $1/$3이어야 한다는 것을 깨달았습니다.. .
:)
답변1
bash
쉘을 사용하는 경우 다음 을 시도해 볼 수 있습니다.
if [ $2 == "+" ] ;then
res=$(($1 + $3))
echo $res
fi
편집하다
'
다음 줄을 변경합니다( by 로 대체됨 "
).
else res=`Operación no válida` ;
도착하다:
else res="Operación no válida" ;
편집 2
if else
너무 많은 문을 사용하는 대신 Case 문을 사용할 수 있습니다.
case $2 in
+)
res=`expr $1 + $3`
;;
-)
res=`expr $1 - $3`
;;
/)
res=`expr $1 \/ $3`
;;
x)
res=`expr $1 \* $3`
;;
*)
res="Operación inválida"
;;
esac
echo "$res"
답변2
스크립트:
#!/bin/sh
IFS=" " # join arguments with a space character
echo "$* = $(( $* ))"
그것으로 +
쉽습니다:
./calc.sh 10 + 2
10 + 2 = 12
하지만 별표는 이스케이프 처리해야 합니다.
./calc.sh 10 \* 2
10 * 2 = 20
또는
./calc.sh 10 "*" 2
10 * 2 = 20
답변3
@AlexP가 이미 지적했듯이 문자열 비교가 아닌 산술을 수행합니다.
나는 또한 사용을 강력히 권장합니다이중 괄호 [[]]
개별적으로보다는.
그러면 코드는 다음과 같이 작성할 수 있습니다.
#!/bin/bash
if [[ $2 == "+" ]]; then
echo $(($1+$3))
elif [[ $2 == "/" ]]; then
echo $(($1/$3))
fi
실행 예:
./math.sh 2 + 7
9
./math.sh 7 / 2
3
답변4
+
, -
또는 은 셸이나 명령 에만 해당 x
되지 않습니다 . 귀하의 질문은 다음과 같습니다/
[
-eq
수치 비교를 위해.=
문자열 비교 대신 사용- 변수를 인용하는 것을 잊었습니다.
==
표준sh
[
연산자 가 아님
그래서:
if [ "$2" = + ]; then
res=`expr "$1" + "$2"`
fi
또는 case
생성자를 사용하십시오.
case $2 in
+ | - | /) res=`expr "$1" "$2" "$3"`;;
x) res=`expr "$1" "*" "$3"`;;
*) echo >&2 invalid; exit 1;;
esac
expr
이는 고대 시스템을 처리해야 하는 경우에만 사용된다는 점에 유의하세요. 최신 표준 sh
구현에는 연산자를 통한 산술 확장이 내장되어 있으며 대신 $((...))
더 나은 형태의 명령 대체를 사용합니다 .$(...)
`...`