Может ли кто-нибудь сказать мне секретный раздел руководства для появления printf

#!/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использовался для переменных данных и чтобы диагностические сообщения выводились в стандартный поток ошибок.

Также обратите внимание, что наличие опций, принимающих более одного аргумента опции, немного необычно.

-3
25.10.2020, 04:18
0 ответов

Теги

Похожие вопросы