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
또한 여러 옵션 인수를 사용하는 옵션은 약간 특이합니다.