쉘 내장 명령 "shift"의 실제 사용법은 무엇입니까?

쉘 내장 명령 "shift"의 실제 사용법은 무엇입니까?

쉘 스크립트 /usr/bin/ssh-copy-id( openssh-client적어도 Debian에서는 패키지의 일부)를 확인했는데 다음 if 문이 포함되어 있습니다.

if [ "-i" = "$1" ]; then
  shift
  # check if we have 2 parameters left, if so the first is the new ID file
  if [ -n "$2" ]; then
    if expr "$1" : ".*\.pub" > /dev/null ; then
      ID_FILE="$1"
    else
      ID_FILE="$1.pub"
    fi
    shift         # and this should leave $1 as the target name
  fi
else

명령의 요점은 무엇입니까 shift? 내 말은 shift n쉘 내장이 n인수 수를 왼쪽에서 오른쪽으로 이동한다는 것을 알고 있지만 이 스크립트에서 이를 사용하는 이유는 무엇입니까? 왜 사용하지 않습니까:

if [ "-i" = "$1" ]; then
  if [ -n "$3" ]; then
    if expr "$2" : ".*\.pub" > /dev/null ; then
      ID_FILE="$2"
    else
      ID_FILE="$2.pub"
    fi
  fi

답변1

옵션을 분석한 -i후 무엇을 합니까 ? 구문 분석할 매개변수가 더 있습니다. 첫 번째 매개변수 인 경우 -i이를 처리한 후 세 번째 매개변수를 확인해야 합니다. ssh-copy-id보고 있는 이전 버전 에서는 -i이 유일한 옵션이었고 다음 매개변수는 대상 호스트 이름이었습니다. 전달되지 않은 경우 -i대상 호스트 이름이 첫 번째 인수입니다.

if [ "$1" = "-i" ]; then
  target_host_name=$3
else
  target_host_name=$1
fi

옵션이 여러 개인 경우에는 확장되지 않습니다. 매개변수 목록에서 현재 위치를 추적해야 합니다.

if [ "${$position}" = "-i" ]; then
  position=$((position+2))
fi
target_host_name=${$position}

문제는 내가 여기에 쓰고 있는 내용이 유효한 쉘 구문이 아니라는 것입니다. n번째 인수를 얻는 간단한 구성은 없습니다. eval하지만 이는 어색하고 골동품 쉘은 여러 자리 인수 번호를 처리할 수 없습니다.

따라서 옵션이 처리될 때마다 를 호출하여 목록에서 제거됩니다 shift. 옵션에 매개변수가 있는 경우 전화를 걸 shift 2거나 shift다시 전화하여 옵션 매개변수를 제거하세요. 그런 다음 각 옵션이 처리된 후 처리되는 다음 인수는 항상 입니다 $1. 이 방법은 훨씬 더 간단합니다.

if [ "$1" = "-i" ]; then
  shift 2
fi
target_host_name=$1

관련 정보