리눅스 쉘에서 변수로 나누는 방법은 무엇입니까?


136

아래와 같이 쉘에서 명령을 실행하면 expr: non-integer argument오류가 반환 됩니다. 누군가 나에게 이것을 설명해 주시겠습니까?

$ x=20
$ y=5
$ expr x / y 
expr: non-integer argument

4
@ShivanRaptor 질문이 RTFM 질문이라고 주장 할 수도 있지만, 이것은 확실히 유효한 쉘 프로그래밍 질문입니다. 또한 역 참조가 필요없는 언어 (예 : Ruby 또는 JavaScript)에서 온 사람에게도 합리적인 질문입니다. 열린 채로 두어야합니다.
Todd A. Jacobs

6
@ShivanRaptor 아니요, 여기 주제입니다. Bash 프로그래밍에 관한 것입니다. 유닉스 / 리눅스는 주로 프로그래밍이 아니라 시스템을 사용하기위한 것입니다. 이제 쉘 스크립팅은 프로그래밍과 시스템 사용 사이의 경계에 걸쳐 있으므로 어느 사이트에서나 주제가 될 수 있습니다. "네트워킹을 어떻게 설정합니까?"에 대한 질문이 있다면, 그것은 유닉스 / 리눅스에 속할 것입니다. Bash의 대화 형 키 바인딩에 대한 질문이라면 그에 속할 것입니다. 그러나 쉘 스크립팅에 대한 질문은 분명히 여기뿐만 아니라 주제에 관한 것입니다.
Brian Campbell

쉘에서 파이썬을 호출하여 int를 float로 변환하는 $ BASH 변수의 뺄셈과 나눗셈을 보여주는 내 대답을보십시오 : stackoverflow.com/questions/8385627/…
Victoria Stuart

답변:


195

이러한 변수는 쉘 변수입니다. 이를 다른 프로그램 ( 예 :)에 대한 매개 변수로 확장하려면 접 두부 expr를 사용해야합니다 $.

expr $x / $y

이의가 제기 된 이유는 알파벳 문자 ( 예 : , 정수가 아닌)

Bash 쉘을 사용하는 경우 표현식 구문을 사용하여 동일한 결과를 얻을 수 있습니다.

echo $((x / y))

또는:

z=$((x / y))
echo $z

1
bash에 대한 맨 페이지를 읽으면 많은 것을 알 수 있습니다. man bash프롬프트에서 입력 ( q종료)
paddy

62
이 페이지 어딘가에서 GNU / 리눅스 셸 대부분은 정수 연산 만 수행 한다는 사실에 주목 해야합니다 .
Skippy le Grand Gourou

35

나는 그것이 다른 스레드에서 이미 언급되었다고 생각합니다.

calc(){ awk "BEGIN { print "$*" }"; }

다음을 입력하면됩니다.

calc 7.5/3.2
  2.34375

귀하의 경우에는 다음과 같습니다.

x=20; y=3;
calc $x/$y

또는 원하는 경우이 스크립트를 별도의 스크립트로 추가하고 $ PATH에서 사용 가능하게하여 항상 로컬 셸에 포함 시키십시오.

#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }

4
당신은 또한 사용할 수 있습니다echo '1 / 3' | bc -l
유진

19

let을 사용하지 않는 이유; 훨씬 쉬워요. 다음은 유용한 예입니다.

start=`date +%s`
# ... do something that takes a while ...
sleep 71

end=`date +%s`
let deltatime=end-start
let hours=deltatime/3600
let minutes=(deltatime/60)%60
let seconds=deltatime%60
printf "Time spent: %d:%02d:%02d\n" $hours $minutes $seconds

또 다른 간단한 예-1970 년 이후 일 수를 계산하십시오.

let days=$(date +%s)/86400

15

Bash 변수를 참조하려면 매개 변수 확장이 필요합니다

대부분의 Linux 배포에서 기본 셸은 Bash입니다. Bash에서 변수는 매개 변수 확장을 위해 달러 부호 접 두부를 사용해야합니다 . 예를 들면 다음과 같습니다.

x=20
y=5
expr $x / $y

물론 Bash에는 산술 연산자 와 특수한 산술 확장 구문 이 있으므로 expr 바이너리를 별도의 프로세스로 호출 할 필요가 없습니다 . 쉘이 다음과 같이 모든 작업을 수행하도록 할 수 있습니다.

x=20; y=5
echo $((x / y))

참조 산술 확장쉘 산술 모든 피투성이 자세한 내용은 매뉴얼 배쉬 참조 서.
Todd A. Jacobs

1
이과는 아무 상관이없는 역 참조 하지만 보간을 하고 expr2013 년 권장하지 않습니다
질 Quenot에게

@sputnick 당신은 분명히 혼란스러워합니다. 사전을 참고하여 주시기 바랍니다. 역 참조보간을 참조하십시오 .
Todd A. Jacobs

1
더 나은 단어는 확장 되지만 참조 는 아닙니다 . 역 참조 는 우리가 포인터를 사용할 때 사용되는데 , 여기서는 그렇지 않습니다. 단순한 변수 일뿐입니다.
Gilles Quenot

1
@Prashant : tldp는 bash 세계에서 좋은 참고 자료로 알려져 있지 않습니다.
Gilles Quenot

1

가정하자

x=50
y=5

그때

z=$((x/y))

이것은 제대로 작동합니다. 그러나 case 문에서 / 연산자를 사용하여 해결할 수없는 경우. 여기에 코드를 입력하세요 이 경우 div 또는 devide와 같은 간단한 문자열을 사용하십시오. 코드를 참조하십시오


이것은 잘못이다. /쉘 케이스 레이블로 잘 작동합니다. 작동하지 않는 것은 *인용하지 않고 곱하기 위해 사용 하는 것입니다. 실제로 사용했던 것일 수 있습니다. 경우 예제에서 'devide'및 'modulo'인 모든 다음 항목을 효과적으로 무시합니다.
dave_thompson_085

0

소수점 뒤에 숫자를 얻으려면 다음을 수행하십시오.

read num1 num2
div=`echo $num1 / $num2 |bc -l`
echo $div
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.