Linux Bash 스크립트 인수 및 매개변수를 전달하고 구문 분석하는 방법
bash 스크립트/쉘 스크립트로 인수를 구문 분석하고 전달하는 것은 Bash 스크립트 내부의 함수에 인수를 전달하는 방식과 매우 유사합니다. 인수를 스크립트에 전달하는 실제 프로세스를 살펴보고 스크립트 내에서 해당 인수에 액세스하는 방법도 살펴보겠습니다.
실행하기 전에 인수 전달
Bash 인터프리터 명령을 실행하는 동안 스크립트 이름 바로 뒤에 매개변수를 전달할 수 있습니다. 매개변수나 인수를 파일에 전달할 수 있습니다. 스크립트에 직접 매개변수 값을 추가하여 스크립트를 정상적으로 실행하기 위한 명령어만 있으면 됩니다. 모든 매개변수는 쉘 스크립트에 전달하기 위한 공백으로 구분된 값입니다.
bash scriptname.sh
위 명령은 매개변수를 전달하지 않고 스크립트를 실행합니다.
반면 아래 명령은 인수를 스크립트에 전달합니다.
bash scriptname.sh parameter1 parameter2 parameter3 nth-parameter
전달 매개변수를 사용하여 bash 스크립트 실행
위 스크린샷은 스크립트에 전달된 매개변수와 이를 수행하는 방법을 표시합니다. 이에 대해서는 다음 섹션에서 설명하겠습니다. 하지만 지금은 bash 환경 변수를 사용하여 스크립트 외부에서 매개변수를 전달한 것을 볼 수 있습니다. 문자열 및 기타 데이터 유형을 사용할 수도 있지만 공백에 주의하세요. 공백은 변수를 별도의 매개변수로 만듭니다. 따라서 특히 문자열의 경우 따옴표로 엄격하게 묶어야 합니다.
명령줄 인수 감지
이제 스크립트 내부에서 해당 매개변수에 액세스하는 방법을 살펴보겠습니다. 전달된 매개변수의 개수를 순서대로 사용합니다. 즉, 전달된 첫 번째 매개변수의 경우 $1을 변수로 사용하여 매개변수를 구문 분석(액세스)합니다. 첫 번째 매개변수는 $1 변수에 저장됩니다. 또한 이 변수를 원하는 다른 사용자 정의 변수에 할당할 수도 있습니다. 전달된 n번째 매개변수의 경우 $n을 사용하여 해당 특정 매개변수에 액세스할 수 있습니다. 여기서 파일명/스크립트명이 0번째 파라미터이므로 변수명이 1로 시작합니다. 9개 이상의 매개변수가 있는 경우 괄호 없이 숫자 주위에 { }를 사용해야 합니다. bash는 $10만 $1로 보고 0을 제외하므로 단순히 $10 대신 ${10} 등을 사용합니다.
#!/bin/bash echo '1st parameter = $1 ' echo '2nd Parameter = $2 '
위 스크립트는 위치 매개변수(1, 2, 3 등)를 사용하여 명령줄/셸에서 매개변수에 액세스할 수 있습니다.
스크립트에서 인수에 액세스합니다.
보시다시피, 우리는 10부터 매개변수 변수 번호에 액세스하기 위해 {}를 사용했습니다. 스크립트는 for 루프와 while 루프를 사용하여 매개변수를 반복할 수 있지만 이에 대해서는 추가 섹션에서 논의하겠습니다.
Bash 변수에 제공된 인수 할당
또한 이를 다른 사용자 정의 변수에 할당하여 스크립트를 더욱 동적으로 만들고 필요에 따라 구성할 수도 있습니다. 위의 스크립트를 실행하면 두 개의 매개변수만 인쇄되지만 숫자의 매개변수 순서대로 변수를 사용하여 더 많은 매개변수에 액세스할 수 있습니다. 스크립트는 명령줄에서 위치 변수에 액세스하고 스크립트 내 필요할 때마다 필요한 위치에서 사용할 수 있습니다.
#!/bin/bash a=$1 b=$2 p=$(($a*$b)) echo 'The product of $a and $b = $p'
Bash 변수에 제공된 인수 할당
위의 스크립트는 스크립트에 전달된 위치 매개변수(예: $1 및 $2)에 액세스하고 사용자 정의 변수를 저장하여 나중에 액세스하고 그에 따라 수정합니다. 다음 섹션에서 볼 수 있듯이 반복 방법을 사용하여 더 많은 매개변수에 액세스할 수도 있습니다.
또한 -z 또는 -n 플래그를 사용하여 전달된 NULL 또는 빈 매개변수를 확인할 수 있는 기능도 있습니다. 이를 통해 매개변수가 전달되었는지 여부를 확인할 수 있습니다.
#!/bin/bash if [[ -z $1 ]]; then echo 'No parameter passed.' else echo 'Parameter passed = $1' fi
전달된 위치 매개변수를 확인합니다.
이 스크립트를 사용하면 위치 매개변수가 전달되었는지 또는 아무것도 전달되지 않았는지 감지할 수 있습니다. -z 플래그는 BASH에서 NULL 또는 초기화되지 않은 변수를 확인합니다. -z 플래그는 전달된 변수가 NULL이거나 초기화되지 않은 경우 true를 반환합니다. 따라서 기본 If-else 문을 사용하여 전달된 매개변수를 감지할 수 있습니다.
매개변수가 전달되지 않으면 true를 반환하는 -n 플래그를 사용할 수도 있으므로 !를 사용해야 합니다. 조건을 뒤집으려면.
다음과 같습니다:
#!/bin/bash if [[ ! -n $1 ]]; then echo 'No parameter passed.' else echo 'Parameter passed = $1' fi
이 스크립트도 동일한 출력을 제공하지만 -z 대신 -n 플래그를 사용하고 있습니다.
For 또는 While 루프를 사용하여 여러 인수 읽기
@ 변수를 사용하여 명령줄을 통해 스크립트에 전달된 모든 매개변수에 액세스할 수 있습니다. BASH에서 변수 배열을 보유하는 특수 변수입니다. 이 경우에는 단독으로 사용하므로 전달된 위치 매개변수 배열이 포함됩니다. 이를 사용하여 루프나 while 루프를 사용하여 전달된 매개변수를 반복할 수도 있습니다.
#!/bin/bash for i in $@ do echo -e '$i ' done
루프와 @ 변수를 사용하여 매개변수에 배열 요소로 액세스합니다.
@ 배열에 요소가 있을 때까지 반복하기 위해 범위 기반 for 루프를 사용했습니다. 우리는 단순히 배열을 반복하고 요소를 인쇄합니다. 간단히 할당하고, 값을 수정하고, 매개변수와 인수에 필요한 변경을 수행하여 스크립트에서 원하는 결과를 얻을 수 있습니다.
또는
while 루프와 BASH의 환경 변수를 사용하여 인수를 인쇄할 수도 있습니다.
#!/bin/bash i=$(($#-1)) while [ $i -ge 0 ]; do echo ${BASH_ARGV[$i]} i=$((i-1)) done
while 루프를 사용하여 전달된 매개변수를 반복합니다.
우리는 변수 '를 사용하고 있습니다 # ' 전달된 매개변수의 개수를 보유하고 있기 때문입니다. 매개변수의 개수를 초기화하고 배열을 사용하여 반복할 예정이므로 매개변수 중 하나를 제거합니다. 따라서 평소와 같이 배열의 인덱스는 0부터 시작합니다. 이 배열은 전달된 마지막 요소 또는 매개변수에서 초기화되므로 전달된 순서대로 모든 매개변수를 인쇄하려면 0까지 카운터를 줄여야 합니다. 간단히 BASH_ARGV 배열을 사용하여 매개변수에 액세스하고 해당 값을 인쇄합니다. 또한 매 반복마다 산술 이중 중괄호를 사용하여 반복자 또는 카운터인 i의 값을 1씩 줄입니다. 여기에서 출력 스크린샷에 표시된 대로 while 루프를 사용하여 스크립트에 전달된 모든 매개변수를 간단히 인쇄합니다.
매개변수 이름으로 읽기
getopts를 사용하여 인수 및 매개변수 구문 분석
루프 및 스위치 케이스 문을 사용하여 명령줄/터미널에서 스크립트에 전달된 인수를 구문 분석하기 위해 getopts 프로그램/명령을 사용할 수 있습니다.
#!/bin/bash while getopts n:c: option do case '${option}' in n)nation=${OPTARG};; c)code=${OPTARG};; esac done echo 'Nation : $nation' echo 'code : $code'
getopts를 사용하여 인수 및 매개변수 구문 분석
getopts를 사용하면 명령줄의 위치 인수/매개변수를 bash 변수에 직접 할당할 수 있습니다. 이를 통해 매개변수를 훌륭하고 체계적으로 관리할 수 있습니다. 위 스크립트에서는 getopts 구문, while 루프 및 switch-case 문을 사용하여 bash 변수를 저장하기 위해 두 개의 인수를 사용했습니다.
모든 인수의 값 인쇄
전달된 모든 매개변수를 저장하는 간단하고 강력한 변수 '@'를 통해 스크립트에 전달된 인수를 인쇄할 수 있습니다.
#!/bin/bash echo 'The arguments passed in are : $@'
모든 인수의 값 인쇄
전달된 매개변수 수에 액세스
또한 변수 '#'을 사용하여 명령줄에서 전달된 매개변수 수에 액세스할 수도 있습니다. # 변수에는 기본적으로 스크립트에 전달되는 매개변수/인수의 수가 포함됩니다.
#!/bin/bash echo 'The number of arguments passed in are : $#'
전달된 매개변수 수에 액세스
bash 스크립트에서 변수를 전달하고 파싱하는 과정과 사양은 다음과 같습니다. 변수를 이동하고 수정하는 논리는 사용자의 손에 있습니다. 이는 인수를 명령줄에서 스크립트로 전달하고 구문 분석하여 더욱 동적으로 만드는 방법을 보여주는 것이었습니다.