Что такое shift
: это встроенная оболочка, которая работает следующим образом (адаптировано из TLDP):
Команда shift принимает один аргумент, число (если оно отсутствует, предполагается, что оно равно 1). Позиционные параметры (например, аргументы команды) смещаются влево на это число N. Позиционные параметры от N+1 до $ # переименовываются в имена переменных от $ 1 до $ # - N+1.
Часто вы делаете цикл, в котором вы обрабатываете один или несколько аргументов, затем вызываете shift, чтобы "забыть" их, и снова делаете цикл для обработки следующих.
Причина ошибки: ошибка возникает из-за того, что некоторые оболочки (но не все) обнаруживают, когда недостаточно аргументов для shift
. В частности, dash
считает это фатальной ошибкой.
Возможные решения:
Проверьте, достаточно ли оставшихся аргументов: if [ "$#" -gt 0 ]; then shift; fi
Добавьте условный аргумент: shift $(( $# > 0 ? 1 : 0 ))