쉘 스크립트 /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