Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

Bash 쉘 스크립트에 옵션을 포함하는 방법

터미널 명령에는 일반적으로 명령이 수행하는 작업을 수정하는 데 사용할 수 있는 옵션이나 스위치가 있습니다. 옵션은 명령줄 인터페이스에 대한 POSIX 사양에 포함되어 있습니다. 또한 초기 UNIX 응용 프로그램과 함께 확립된 유서 깊은 규칙이므로 고유한 명령을 만들 때 Bash 스크립트에 포함하는 방법을 아는 것이 좋습니다.

대부분의 언어와 마찬가지로 Bash의 구문 분석 옵션 문제를 해결하는 방법에는 여러 가지가 있습니다. 지금까지 내가 가장 좋아하는 방법은 Patrick Volkerding의 Slackware 빌드 스크립트에서 배운 방법으로 남아 있습니다. 이 스크립트는 Linux를 처음 발견하고 OS와 함께 제공된 일반 텍스트 파일을 감히 탐색할 때 셸 스크립팅에 대한 입문서 역할을 했습니다.

Bash의 옵션 구문 분석

Bash에서 옵션을 구문 분석하는 전략은 셸 스크립트에 전달된 모든 인수를 순환하고 옵션인지 여부를 확인한 다음 다음 인수로 이동하는 것입니다. 옵션이 남아 있지 않을 때까지 이 과정을 반복합니다.

간단한 부울 옵션(스위치이라고도 함)으로 시작 또는 플래그 ):

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
else
    break
fi
done

echo $ALPHA

이 코드에서는 while 더 이상 처리할 인수가 없을 때까지 무한 루프 역할을 하는 루프입니다. if 문은 첫 번째 위치($1)에서 발견된 모든 인수와 일치시키려고 시도합니다. )를 --alpha로 또는 -a . (이들은 특별한 의미가 없는 임의의 옵션 이름입니다. 실제 스크립트에서는 --verbose를 사용할 수 있습니다. 및 -v 자세한 출력을 트리거).

shift 키워드는 모든 인수가 1만큼 이동하도록 하여 위치 2의 인수($2 ) 위치 1($1)로 이동 ). else 문이 더 이상 처리할 인수가 없을 때 트리거되어 while가 중단됩니다. 루프.

스크립트 끝에서 $ALPHA 값 터미널에 인쇄됩니다.

스크립트 테스트:

$ bash ./test.sh --alpha
1
$ bash ./test.sh

$ bash ./test.sh -a
1

옵션이 올바르게 감지되었습니다.

Bash에서 인수 감지

하지만 문제가 있습니다. 추가 인수는 무시됩니다.

$ bash ./test.sh --alpha foo
1
$

옵션으로 의도되지 않은 인수를 잡기 위해 나머지 인수를 Bash 배열에 덤프할 수 있습니다.

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
else
    break
fi
done

echo $ALPHA

ARG=( "${@}" )
for i in ${ARG[@]}; do
    echo $i
done

새 버전의 스크립트 테스트:

$ bash ./test.sh --alpha foo
1
foo
$ bash ./test.sh foo

foo
$ bash ./test.sh --alpha foo bar
1
foo
bar

인수 옵션

일부 옵션에는 자체 인수가 필요합니다. 예를 들어, 사용자가 그래픽의 색상이나 해상도와 같은 속성을 설정하거나 애플리케이션이 사용자 정의 구성 파일을 가리키도록 허용할 수 있습니다.

Bash에서 이것을 구현하려면 shift를 사용할 수 있습니다. 부울 스위치와 마찬가지로 키워드를 사용하지만 인수를 1 대신 2로 이동합니다.

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
elif [ "$1" = "--config" -o "$1" = "-c" ]; then
    CONFIG=$2
    shift 2
else
    break
fi
done

echo $ALPHA
echo $CONFIG

ARG=( "${@}" )

for i in ${ARG[@]}; do
    echo $i
done

이 코드에서 elif를 추가합니다. 각 인수를 --config와 비교하는 절 및 -c . 일치하는 경우 CONFIG라는 변수의 값이 두 번째 인수가 무엇이든 값으로 설정됩니다(이는 --config 옵션에는 인수가 필요합니다). 모든 인수는 --config를 이동하기 위해 2:1만큼 자리를 이동합니다. 또는 -c , 1을 눌러 인수를 이동합니다. 평소와 같이 일치하는 인수가 남아 있지 않을 때까지 루프가 반복됩니다.

다음은 새 버전의 스크립트 테스트입니다.

$ bash ./test.sh --config my.conf foo bar
my.conf
foo
bar
$ bash ./test.sh -a --config my.conf baz
1
my.conf
baz

손쉬운 옵션 구문 분석

Bash에서 옵션을 구문 분석하는 다른 방법이 있습니다. 대안으로 case를 사용할 수 있습니다. 문 또는 getopt 명령. 무엇을 사용하기로 선택하든 사용자를 위한 옵션은 모든 애플리케이션의 중요한 기능이며 Bash를 사용하면 쉽게 사용할 수 있습니다.