5

Следующий скрипт прекрасно работает на одном из моих компьютеров, печатая 1 затем 2:

#!/bin/sh

echo "1"
shift
echo "2"

Однако на другом компьютере он выдает следующий вывод:

1
./script.sh: 4: shift: can't shift that many

man shift не помогает (No manual entry for shift).

Что это за ошибка, почему она происходит и как я могу это исправить?

1 ответ1

6

Что такое shift: это встроенная оболочка, которая работает следующим образом (адаптировано из TLDP):

Команда shift принимает один аргумент, число (если оно отсутствует, предполагается, что оно равно 1). Позиционные параметры (например, аргументы команды) смещаются влево на это число N. Позиционные параметры от N+1 до $ # переименовываются в имена переменных от $ 1 до $ # - N+1.

Часто вы делаете цикл, в котором вы обрабатываете один или несколько аргументов, затем вызываете shift, чтобы "забыть" их, и снова делаете цикл для обработки следующих.

Причина ошибки: ошибка возникает из-за того, что некоторые оболочки (но не все) обнаруживают, когда недостаточно аргументов для shift . В частности, dash считает это фатальной ошибкой.

Возможные решения:

  • Проверьте, достаточно ли оставшихся аргументов: if [ "$#" -gt 0 ]; then shift; fi

  • Добавьте условный аргумент: shift $(( $# > 0 ? 1 : 0 ))

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .