현재 IT 학위를 위해 Shell 스크립팅을 배우고 있습니다. 우리가받은 튜토리얼 중 하나 에서처럼 두 개의 숫자를 추가하는 작은 스크립트를 작성하려고합니다.
echo "Enter two numbers" read num1 num2 sum = "expr $num1 + $num2" echo "The sum is = $sum"
하지만 실행 권한을 부여하고 스크립트를 실행하면이 오류가 발생합니다.
sum: =. No such file or directory. sum: expr $num1 + $num2: No such file or directory
우분투와 페도라에서 실행을 시도했지만 동일한 오류가 발생합니다. 누구든지 내가 여기에서 누락 된 부분을 알려주시겠습니까?
댓글
- 관련 : unix.stackexchange.com/questions/40786/ …
답변
먼저 과제를위한 공백을 제거해야합니다. 예 :
sum="expr $num1 + $num2"
그런 다음 "
를 `
로 변경하거나 더 나은 방법으로 :
sum=$(expr "$num1" + "$num2")
expr
를 사용하는 대신 계산을 수행 할 수도 있습니다. 쉘에서 직접 생성 :
sum=$((num1 + num2))
댓글
- iv id =를 사용하려는 동기
$((...))
대신 “d077711eec”>
는 클래식 Bourne 셸로 이식하려는 욕구이며 ' 좋은 아이디어입니다. $(...)
도 방지합니다.
$()
를 지원하지 않는 셸이 있습니까? 내가 아는 한 posix에 필요합니다. 모든 posix 호환 쉘은 $()
를 지원해야합니다.
$(…)
그러나 거의 종료되었습니다 (어딘가에서 Solaris에서 여전히 /bin/sh
를 실행 중일 수 있음). $(…)
– 또는 적어도 모든 버전이 아닙니다. 답변
줄에서 백틱을 작은 따옴표로 잘못 읽었을 것입니다.
sum = "expr $num1 + $num2"
$(...)
사용에 대해서는 Greg의 Wiki 를 참조하세요.
이 예상대로 작동합니다.
sum=$(expr "$num1" + "$num2")
또한 등호 (변수 할당) 주위에 간격이 없습니다.
답변
expr
는 본 쉘 (예 : sh). Bourne 쉘은 원래 간단한 산술을 수행하는 메커니즘이 없었습니다. 백틱을 사용하여 expr
외부 프로그램을 사용합니다.
백틱 (`)는 실제로 명령 대체라고합니다. 명령 대체는 셸이 지정된 명령 집합을 수행 한 다음 해당 출력을 명령 위치.
sum=`expr $num1 + $num2`
bash (bourne again shell) 다음과 같은 systax를 가지며 “외부 프로그램 expr
을 사용하지 않습니다.
sum=$((num1+num2))
외부 프로그램 expr
을 사용하려는 경우. 다음과 같은 구문이 있습니다.
sum=$(expr $num1 + $num2)