#!/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"
Ваш код немного сложен для понимания из-за разбросанности shift
, но основная проблема заключается в том, что вам не хватает одной операции shift
на цикл. Ваш сценарий правильно вычисляет результат первой арифметической операции, но когда дело доходит до просмотра второй арифметической операции, он выполнил только две операции сдвига (, каждая -p A B
требует обработки трех shift
, а для следующих -m C D
находиться в $1
, $2
и$3
).
Моя модифицированная версия вашего кода выполняет только один shift 3
после каждой операции, в то время как сама операция использует $1
, $2
и $3
. Я также использую более современное арифметическое расширение $((... ))
, а не устаревшую утилиту expr
. Я проверяю $#
, есть ли еще аргументы командной строки для обработки, и я немного обновил вывод, чтобы printf
использовался для переменных данных и чтобы диагностические сообщения выводились в стандартный поток ошибок.
Также обратите внимание, что наличие опций, принимающих более одного аргумента опции, немного необычно.