Из документации bash документации shift n
:
Если n
равно нулю или больше $#
, позиционные параметры не изменяются.
Таким образом, если $#
равно 1 и вы выполняете shift 2
, ничего не происходит, но состояние возврата будет ненулевым, что указывает на ошибку.
Posix требует, чтобы аргумент n
быть не больше, чем $#
.Если вы не обеспечите это, сценарий может быть прерван (если он не является интерактивным) или команда shift
может завершиться с ненулевым состоянием.Таким образом, даже помимо этой конкретной проблемы, переносимый код не должен использовать shift n
, если не известно, что существует хотя бы n
аргументов.