2 수의 곱셈과 덧셈

2 수의 곱셈과 덧셈
M="Wrong"  
P="Wrong"  
I=$1  
while [ "$I" != "" ]  
do  
  case $I in  
  -m | --multiplying)   
      shift  
      M=`expr $1 \* $2`  
      ;;  
  -p | --plus )   
      shift  
      P=`expr $1 + $2`  
      ;;   
  *)  echo "Something wrong"  
      exit 1  
      ;;  
  esac  
  shift  
  I=$1  
done  
echo "Multiplying=$M, Adding=$P"  

-m과 -p 각각 뒤에 두 개의 숫자를 제공하므로
코드를 실행할 때 이런 일이 일어나기를 원합니다.

./code.sh -m 2 2 -p 5 5  

Multiplying=4 Adding=10   

내 코드는 and -p 부분을 건너뛰고 바로 다음으로 이동합니다.

*) echo "Something wrong"

내가 뭘 잘못했나요?

답변1

#!/bin/sh

M="Wrong"
P="Wrong"

while [ "$#" -gt 0 ]; do

    case $1 in
        -m|--multiplying)
            M=$(( $2 * $3 ))
            ;;
        -p|--plus)
            P=$(( $2 + $3 ))
            ;;
        *)  echo 'Error in command line options' >&2
            exit 1
    esac

    shift 3
done

printf 'Multiplying=%s, Adding=%s\n' "$M" "$P"

s 흩어져 있기 때문에 코드를 이해하기가 약간 어렵지만 shift주요 문제는 각 루프에 shift작업이 없다는 것입니다. 스크립트는 첫 번째 산술 연산의 결과를 올바르게 계산하지만 두 번째 산술 연산을 보면 두 개의 시프트 연산만 수행합니다( -p A B각 시프트 연산은 3개씩 처리되어야 하며 후속 연산은 at 및 in입니다).shift-m C D$1$2$3

내 코드의 수정된 버전은 각 작업 후에 한 번만 실행되는 shift 3반면 작업 자체는 및 를 사용 합니다 $1. 또한 오래된 유틸리티 대신 최신 산술 확장을 사용합니다 . 처리할 명령줄 인수가 더 있는지 테스트 중이며 , 가변 데이터를 사용하고 표준 오류 스트림에 진단 메시지를 인쇄하도록 출력을 약간 업데이트했습니다 .$2$3$(( ... ))expr$#printf

또한 여러 옵션 인수를 사용하는 옵션은 약간 특이합니다.

관련 정보