포스팅을 봤네요쉘 명령 이동 설명. 거기에는 코멘트를 할 수 없어서 Shift 명령의 사용법을 알고 싶습니다. 이것은 Shift를 사용한 후에 스크립트에 전달된 매개변수가 비어 있다는 것을 의미합니까? 이 명령의 이점은 무엇입니까
답변1
결과적으로 빈 인수 목록이 생성될 수도 있고 그렇지 않을 수도 있습니다. 이는 시작된 매개변수 수와 getopts
발견된($OPTIND에 설정된) 관련 매개변수 수에 따라 달라집니다. getopts는 로 시작하지 않는 모든 인수를 무시하고 -
후속 --
인수를 옵션으로 처리하는 것을 중지하도록 getopts에 지시합니다(예: rm -f -- -filenamebeginningwith-.txt
).
예를 들어 5개의 args가 있는 경우 -x -y -z file1 file2
처음 shift 3
3개의 args는 제거되고 args만 남습니다 file1 file2
.
답변2
이 명령을 사용하는 이유는 shift $((OPTIND -1))
구문 분석된 옵션을 "건너뛰고" getopts
추가 처리를 위해 파일 유형 매개변수를 유지하기 위한 것입니다.
이는 $OPTIND
쉘의 내장 명령에 의해 관리되는 쉘 변수입니다. getopts
쉘이 시작될 때 $OPTIND
1과 동일하며 getopts
옵션 또는 옵션 인수를 검색하기 위해 호출이 이루어질 때마다 증가됩니다.
shift
현재 매개변수 목록의 시작 부분에서 원하는 만큼의 매개변수를 제거합니다.
- 이 호출은
shift 3
쉘의 인수 목록에서 처음 3개의 인수를 되돌릴 수 없게 제거합니다.
답변3
기본적으로 "shift" 명령을 사용하면 스크립트나 함수에 전달된 인수를 "찾아볼" 수 있습니다.
주요 용도는 더 이상 인수가 없을 때까지 "이동"하는 동안 루프에서 $0에 액세스하는 것입니다.
Shift $(($OPTIND-1)) 의 정확한 사용법은 getopts 구문 분석 및 정규화 옵션을 건너뛰는 것입니다(즉, -uvh는 -u -v -h가 됩니다). 따라서 이렇게 하면 첫 번째 "비 옵션"을 얻게 됩니다. " 매개변수는 매개변수 배열의 $0 위치에 있습니다.
답변4
데모에서는 다음을 설명할 수 있습니다.
$ set -- 1 2 3 4 5 6 # set the positional parameter $1, $2, ...
$ echo "$@" # print the positional params
1 2 3 4 5 6
$ shift 3
$ echo "$@"
4 5 6
이제, [ $1 -eq 4 ] && [ $2 -eq 5 ] && [ $3 -eq 6 ]