Почему сдвиг с аргументом вызывает бесконечный цикл в этом скрипте bash? - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть следующий сценарий bash:

#!/bin/bash

while (( "$#" )); do

  case $1 in
    --foo)
      foo=$2
      ;;
    --bar | -b)
      bar=$2
      ;;
    *)
      echo "what?"
      ;;
  esac

  shift
  shift

done

echo $foo
echo $bar

Если я запускаю ./my_script.sh -b first --foo second --third, я получаю

what?
second
first

Но если я изменю два оператора shift наsingle shift 2 Я просто получаю бесконечный цикл в what? s.Какая разница между shift; shift и shift 2 вызывает это?

1 Ответ

0 голосов
/ 23 декабря 2018

Из документации bash документации shift n:

Если n равно нулю или больше $#, позиционные параметры не изменяются.

Таким образом, если $# равно 1 и вы выполняете shift 2, ничего не происходит, но состояние возврата будет ненулевым, что указывает на ошибку.

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

...