Bash 스크립트에서 일반 매개변수와 표시된 매개변수를 혼합하는 방법은 무엇입니까?

Bash 스크립트에서 일반 매개변수와 표시된 매개변수를 혼합하는 방법은 무엇입니까?

예를 들어 gcc는 플래그가 없는 입력 파일과 -o다음 플래그가 있는 출력 파일을 허용합니다.

gcc input.c -o output.out

또는

gcc -o output.out input.c

-s사용자가 각각 , -l및 플래그를 사용하여 -u특수 문자, 소문자 및 대문자 수를 지정할 수 있는 임의 비밀번호 생성기 bash 스크립트를 만들고 있습니다 . 또한 플래그 없이 비밀번호 길이를 지정할 수 있어야 합니다.

사용 예:

./randompassword.sh -s2 -u2 -l3 16

특수 문자 2개, 대문자 2개, 소문자 3개를 포함하고 길이가 16인 비밀번호를 나타내야 합니다.

getopts다음과 같이 플래그를 구문 분석 할 수 있습니다 .

while getopts s:l:u: flag
do
    case "${flag}" in
        s) special=${OPTARG};;
        l) lower=${OPTARG};;
        u) upper=${OPTARG};;
    esac
done

하지만 플래그 없이 길이 매개변수를 얻는 방법을 모르겠습니다.

을 사용해 보았지만 $1이 매개변수는 gcc 예제처럼 명령의 어느 곳에나 있을 수 있어야 합니다.

답변1

getopts옵션이 아닌 인수에 도달하면 인수 목록 구문 분석을 중지합니다. 즉, 옵션 인수를 왼쪽에서 오른쪽으로 반복할 때 성공을 반환하고 옵션이 아닌 첫 번째 인수에서는 실패를 반환합니다. 따라서 올바른 사용 사례는 입니다 put options and their arguments on the command line before any non-option arguments.

getops그러면 튜토리얼에 명령이 표시됩니다 shift $((OPTIND - 1)). 루프 while는 옵션 매개변수를 반복하고 shift위치 변수에서 이를 제거하고 옵션이 아닌 매개변수(있는 경우)를 $@.

코드에서 튜토리얼의 변수를 사용합니다.

while getopts ':s:l:u:' OPTION
do
  case "${OPTION}" in
    s) special=${OPTARG};;
    l) lower=${OPTARG};;
    u) upper=${OPTARG};;
   \?) echo "$0: Error: Invalid option: -${OPTARG}" >&2; exit 1;;
    :) echo "$0: Error: option -${OPTARG} requires an argument" >&2; exit 1;;
  esac
done
shift $((OPTIND - 1))
# now the positional variables have the non-option arguments
echo "${1}"

예제 명령( ./randompassword.sh -s2 -u2 -l3 16)의 경우 출력은 입니다 16.

:getopts 문자열에 선두를 추가한 이유는 "자동 오류 보고"를 제공하기 때문입니다. 이를 통해 스크립트는 오류를 포착하고 좀 더 친숙한 불만 사항을 발행할 수 있습니다. 이것이 제가 성명서에 추가한 두 가지 추가 옵션이 하는 일입니다 case.

사용자가 규칙을 위반하여 옵션 매개변수를 입력한 경우뒤쪽에옵션이 아닌 매개변수, 후속 옵션 매개변수는 while위 루프에서 구문 분석되지 않습니다. $@나머지 위치 매개변수가 포함된 배열 에 표시됩니다 . 사용자가 지침에 따라 옵션이 아닌 인수 앞에 모든 옵션 인수를 입력하면 $@루프와 명령이 완료된 후 배열에 옵션이 아닌 인수가 포함됩니다.whileshift

옵션이 아닌 인수가 입력되는 순서에 대한 우려 사항에 따라 스크립트에는 사용자가 따라야 하는 엄격한 순서가 필요하거나(그렇지 않으면 오류가 발생함) 스크립트에 특정 순서가 필요하지 않고 사용자가 따라야 합니다. 다른 구문 분석 방법을 사용하여 사용 방법을 알아보세요.

하지만 제 생각에는 순서가 지정되지 않은 매개변수 때문에 옵션 문자가 있는 것 같습니다. 나머지 인수는 순서가 지정되어 있습니다. 그렇지 않으면 옵션 문자가 표시됩니다. 그러나 이것은 단지 내 의견일 뿐이다.

관련 정보