문제

Bash 스크립트에 문제가 있습니다. 연산자 *를 사용하여 곱하기를해야합니다. 대신 스크립트는 스크립트 자체의 이름을 확장하고 연산자로 사용하여 저를 버그로 만듭니다. 나는 단일 따옴표로 시도했지만 작동하지 않습니다 :( 여기 코드가 있습니다.

#!/bin/bash -x

# Bash script that calculates an arithmetic expression
# NO PRECEDENCE FOR OPERATORS
# Operators: + - * 

if [ "$#" -lt "3" ]
then 
    echo "Usage: ./calcola.scr <num> <op> <num> ..."
    exit 1
fi

result=0
op=+
j=0

for i in "$@"
do
    if [ "$j" -eq "0" ]
    then
        # first try
        #result=$(( $result $op $i )) 

        # second try
        let "result$op=$i"

        j=1
    else
        op=$i
        j=0
    fi
done

echo "Result is $result"

exit 0
도움이 되었습니까?

해결책

"op"가 "*"인 경우 스크립트가보기 전에 쉘에 의해 확장됩니다. "X"와 같은 곱셈 연산자를 위해 다른 것을 선택하거나 사용자가 단일 따옴표로 넣거나 백 슬래시로 미리 미리 미리 탈출하도록 강요해야합니다.

연습 조건에서 허용되면 "읽기"를 사용하여 명령 줄에서 가져 오는 대신 표준 입력에서 표현식을 가져 오려고 시도해야합니다.

다른 팁

스크립트에 대해 "* 확장"(일반적으로 "글로브"라고 함)이 필요하지 않은 경우 "-f"로 시작하십시오. 런 시간 동안 변경할 수도 있습니다.

mat@owiowi:/tmp/test$ echo *
A B
mat@owiowi:/tmp/test$ set -f
mat@owiowi:/tmp/test$ echo *
*
mat@owiowi:/tmp/test$ set +f
mat@owiowi:/tmp/test$ echo *
A B

그것은 작동합니다. 당신은 단지 탈출하지 않습니다 * 바르게. 백 슬래시를 사용해보십시오.

$ ./calcola.scr 2 \* 3
+ '[' 3 -lt 3 ']'
+ result=0
+ op=+
+ j=0
+ for i in '"$@"'
+ '[' 0 -eq 0 ']'
+ let result+=2
+ j=1
+ for i in '"$@"'
+ '[' 1 -eq 0 ']'
+ op='*'
+ j=0
+ for i in '"$@"'
+ '[' 0 -eq 0 ']'
+ let 'result*=3'
+ j=1
+ echo 'Result is 6'
Result is 6
+ exit 0
$

폴 톰린으로서 말하는, 아마도 사용하는 것이 좋습니다 x 대신 곱셈 연산자로서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top