Bash 기술: shift 내 장 된 명령 을 사용 하여 이전 명령 매개 변 수 를 왼쪽으로 이동 합 니 다.

3757 단어 linuxbashshell
bash 에 서 는 위치 매개 변수 (positional parameters) 를 사용 하여 스 크 립 트 에 들 어 오 거나 함수 에 들 어 오 는 매개 변수 값 을 가 져 올 수 있 습 니 다.예 를 들 어 $1 들 어 오 는 첫 번 째 매개 변수 에 대응 하고 $2 들 어 오 는 두 번 째 매개 변수 에 대응 합 니 다.순서대로 유추 하 다.
위치 매개 변 수 를 바 꾸 기 위해 서 shift 내 장 된 명령 을 사용 할 수 있 습 니 다.예 를 들 어 shift 1 명령 을 실행 하면 $1 들 어 오 는 두 번 째 매개 변수 에 대응 하고 $2 들 어 오 는 세 번 째 매개 변수 에 대응 합 니 다.순서대로 유추 하 다.
man bash 가 shift 명령 에 대한 설명 은 다음 과 같 습 니 다.
shift [n]
The positional parameters from n+1 ... are renamed to $1 .... Parameters represented by the numbers $# down to $#-n+1 are unset.
n must be a non-negative number less than or equal to $# . If n is 0, no parameters are changed.
If n is not given, it is assumed to be 1. If n is greater than $# , the positional parameters are not changed.
The return status is greater than zero if n is greater than $# or less than zero; otherwise 0.
즉, shift 명령 은 주어진 n 매개 변수 값 을 바탕 으로 위치 매개 변 수 를 바 꾸 는 것 이다.$1 이름 을 $n+1 로 바 꿉 니 다.$2 이름 을 $n+2 로 바 꿉 니 다.뒤의 매개 변 수 는 이런 식 으로 유추 된다.n 개의 위치 변 수 를 왼쪽으로 이동 하 는 것 과 유사 합 니 다.
n 인자 가 제공 되 지 않 으 면 기본 값 은 1 입 니 다.주어진 n 은 0 보다 크 거나 같은 정수 여야 합 니 다.shift 명령 의 매개 변 수 는 음수 일 수 없 기 때문에 이 명령 을 실행 하여 위치 매개 변 수 를 바 꾼 후 이 명령 을 사용 하여 원래 의 위치 매개 변수 로 복원 할 수 없습니다.shift 명령 을 실행 하면 $# 의 값 은 남 은 매개 변수 개수 로 업데이트 되 고 $@ 남 은 매개 변수 목록 만 가 져 옵 니 다.
스 크 립 트 에 들 어 온 매개 변 수 를 스 크 립 트 함수 에 전달 해 야 할 때 shift 명령 을 사용 하여 위치 변 수 를 바 꾸 고 인용 하기 편리 합 니 다.
다음은 하나의 testshift.sh 스 크 립 트 로 이 명령 의 용법 을 예 로 들 어 설명 합 니 다. 스 크 립 트 의 내용 은 다음 과 같 습 니 다.
#!/bin/bash

reverse=0

function print_params()
{
    local string="$@"
    if [ $reverse -eq 1 ]; then
        echo $string | rev
    else
        echo $string
    fi
}

while getopts "r" opt; do
    case $opt in
        r) reverse=1 ;;
    esac
done

shift $((OPTIND-1))
print_params "$@"

이 스 크 립 트 는 -r 옵션 을 받 을 수 있 습 니 다. 이 옵션 을 제공 하면 rev 명령 으로 문자열 인 자 를 역순 으로 출력 합 니 다.이 옵션 을 제공 하지 않 으 면 문자열 인 자 를 정렬 출력 합 니 다.getopts 명령 으로 옵션 파 라 메 터 를 처리 하면 OPTIND 전역 변 수 는 옵션 매개 변수의 개 수 를 추가 하고 그 값 은 1 부터 시작 합 니 다.$((OPTIND-1)) 표현 식 을 사용 하여 제공 하 는 모든 옵션 매개 변수 개 수 를 가 져 올 수 있 습 니 다.
예 를 들 어 ./testshift.sh -r 명령 을 실행 하고 -r 옵션 인 자 를 제공 합 니 다.이 옵션 의 매개 변 수 를 처리 한 후 OPTIND 의 값 은 2 이 고 1 을 빼 면 옵션 매개 변수의 개수 입 니 다.getopts 명령 을 사용 하여 주어진 옵션 파 라 메 터 를 건 너 뛴 후 shift $((OPTIND-1)) 가 져 온 매개 변수 목록 에 옵션 파 라 메 터 를 포함 하지 않 습 니 다.
이 옵션 의 매개 변 수 는 print 에 전달 할 필요 가 없습니다.params 함수.
만약 여기에 $@ 명령 을 사용 하지 않 고 shift 문장 으로 직접 쓰 면 printparams 함 수 는 들 어 오 는 print_params "$@" 옵션 을 받 을 수 있 으 며, -r 옵션 은 $1 옵션 입 니 다.그러면 함 수 는 이 옵션 을 특수 처리 해 야 합 니 다. 코드 가 세련 되 지 않 습 니 다.
즉, 명령 행 인자 의 앞의 몇 개의 인 자 를 건 너 뛰 려 면 그 후의 모든 인 자 를 다른 곳 에 통일 적 으로 전달 하여 사용 -r 명령 을 사용 하 는 것 이 편리 하 다 는 것 이다.그렇지 않 으 면 명령 행 인 자 를 옮 겨 다 니 며 뒤의 모든 매개 변수 값 을 가 져 오고 따로 저장 한 다음 에 전달 해 야 합 니 다. 그러면 귀 찮 습 니 다.
실행 shift 스 크 립 트 결 과 는 다음 과 같 습 니 다.
$ ./testshift.sh            
           
$ ./testshift.sh -r            
           

이 를 통 해 알 수 있 듯 이 testshift.sh 명령 은 ./testshift.sh -r 옵션 을 제공 하고 주어진 문자열 인 자 를 거꾸로 인쇄 합 니 다.-r 명령 을 사 용 했 기 때문에 이 shift 옵션 은 print 에 전달 되 지 않 았 습 니 다.params 함수 입 니 다. 인쇄 된 내용 은 이 옵션 을 포함 하지 않 습 니 다.

좋은 웹페이지 즐겨찾기