Ошибка "Не могу сдвинуть так много" в операторе da sh case - PullRequest
2 голосов
/ 02 августа 2020

Я запускаю Arch Linux и пишу сценарии в Da sh.

У меня есть фиктивный сценарий, который выводит все переменные, которые я установил с помощью параметров. Я следовал руководству, в котором рекомендовалось вводить данные таким образом. Ссылка на статью

while [ ! -z "$1" ]; do
    case "$1" in
        --param|-p)
            shift
            #code
            ;;
        --other-param|-op)
            shift
            # code
            ;;
    esac
shift
done

В приведенной ниже MRE ввод параметра -e приводит к ошибке «сдвиг: невозможно сдвинуть так много» в строке shift внутри этого код параметра. Он согласован, и я понятия не имею, что это означает.

Почему возникает эта ошибка?

Мой сценарий MRE работает da sh как оболочка и выглядит следующим образом:

#!/bin/dash

while [ ! -z "$1" ]; do
    case "$1" in
        -e)
            shift
            echo "Error right about..."
            ;;
    esac
shift
done

Вывод ./mre.sh -e

Error right about...
./mre.sh: 32: shift: can't shift that many

1 Ответ

2 голосов
/ 03 августа 2020

Проблема в shift после esac. Вы уже обработали все аргументы в "$@" в своей демонстрации, так что сдвигать нечего. -t 12 оставляет аргумент в $1 после первого сдвига, а затем сдвигает его тоже, когда он с ним закончил. (Я бы не стал так поступать; второй сдвиг должен произойти внутри case, когда вы закончите с этой конкретной опцией, чтобы вы не заставляли все свои опции требовать аргумент.)

Bash будет работать в этом отношении точно так же, как Da sh, хотя не выдает явного сообщения об ошибке, если shift больше не может.

...