이 자습서에서는 bash 스크립트에 명령줄 인수를 전달하는 방법을 설명합니다. 시작하는 데 도움이 되는 많은 예가 포함되어 있습니다.
Bash/Shell 스크립트는 Linux 워크플로를 자동화하고 업무 시간을 단축하여 사무실을 일찍 떠날 수 있도록(또는 오후 5시가 될 때까지 서버실에 숨을 수 있는) 좋은 방법입니다.
스크립트를 재사용할 수 있게 하면 스크립트가 더 유용해집니다. 다른 정보 세트에 대해 또는 다른 날짜에 동일한 작업을 수행하는 스크립트를 작성할 필요가 없습니다. 동일한 스크립트를 재사용하고 다른 매개변수<를 제공할 수 있습니다. /엠> – 명령줄을 통해 스크립트에 제공된 지침. 이를 명령줄 인수 사용이라고도 합니다. .
예를 들어, 일부 텍스트를 파일로 출력하는 스크립트가 있을 수 있습니다. 파일 이름을 변경하려면 스크립트를 수정해야 합니다. 스크립트가 여러 파일로 출력되도록 하려면 스크립트의 여러 복사본이 필요할 수 있습니다. 매개변수를 사용하면 매개변수로 전달되는 이름과 파일 수에 관계없이 출력할 수 있는 단일 스크립트를 가질 수 있습니다. 명령줄에서.
이러한 매개변수를 전달하는 몇 가지 다른 방법이 있습니다. – 옵션 및 가치 - 달성하려는 것에 따라 스크립트에. 다음은 몇 가지 방법과 예입니다.
getopts / 명령줄 입력을 읽는 플래그 방식
- getopts 옵션을 검색하는 셸 명령입니다. (또는 플래그 ) 명령줄 입력에서 값 (또는 인수 ) 스크립트에서 사용 가능
- 옵션은 단일 문자 앞에 –(대시)가 오고 그 뒤에 전달할 값이 옵니다(예:-v 값).
- 순서가 중요하지 않을 때 가장 잘 사용됨
- 여기에 나열된 방법 중 아마도 가장 좋은 방법일 것입니다.
getopts Bash 스크립트 예
이 예제 스크립트는 패스트푸드 주문에 대해 세 가지 옵션을 사용합니다.
- -o 주문
- -s 크기용
- -d 음료용
fastFoodOrder.sh
#!/bin/bash # Use a while loop to parse through the options o, s, d while getopts o:s:d: flag do # Match each option (which has been assigned to the $flag variable) to it's meaning using a case statement block # OPTARG will be the value received from getopts for the corresponding option and is assigned to a variable depending on the flag case "${flag}" in o) order=${OPTARG};; s) size=${OPTARG};; d) drink=${OPTARG};; esac done # The values as passed to the options are now available in their corresponding variable echo "Order: $order"; echo "Size: $size"; echo "Drink: $drink";
#!/bin/bash에 대해 자세히 알아보려면 여기를 클릭하세요. bash 스크립트 시작 부분에 있는 줄.
이를 실행하려면 다음을 입력하십시오.
bash ./fastFoodOrder.sh -d Cola -o 'Fish Burger Meal' -s Large
그러면 스크립트가 다음과 같이 출력됩니다.
Order: Fish Burger Meal Size: Large Drink: Cola
위의 출력에서 볼 수 있듯이 옵션이 제공된 순서는 중요하지 않습니다.
스크립트를 실행할 때 ./가 사용되는 이유는 무엇입니까?
동일한 옵션에 여러 값 전달
여러 값에 대해 옵션을 여러 번 전달할 수도 있습니다. 그러면 스크립트에서 배열로 사용할 수 있습니다.
값에 모든 문자를 사용할 수 있으므로 단일 옵션에 여러 값을 전달하는 가장 좋은 방법입니다. 값을 따옴표로 묶거나 구분 기호를 사용하면 제한됩니다.
fastFoodOrderExtras.sh
#!/bin/bash # Use a while loop to parse through the options o, s, d, e while getopts o:s:d:e: flag do # Match each option (which has been assigned to the $flag variable) to it's meaning using a case statement block # OPTARG will be the value received from getopts for the corresponding option and is assigned to a variable depending on the flag case "${flag}" in o) order=${OPTARG};; s) size=${OPTARG};; d) drink=${OPTARG};; e) extras+=${OPTARG};;# Create or append an array variable to hold the multiple extras values passed esac done # The values as passed to the options are now available in their corresponding variable echo "Order: $order"; echo "Size: $size"; echo "Drink: $drink"; echo "The list of extras is '${extras[@]}'" # Loop through the multiple extras values for val in "${extras[@]}"; do echo $val done
위의 스크립트는 여러 개의 -e를 허용합니다. 아래와 같이 추가 옵션:
bash ./fastFoodOrderExtras.sh -d Cola -o 'Fish Burger Meal' -s Large -e Sauce -e Salt -e Pepper
스크립트는 다음을 출력합니다:
Order: Fish Burger Meal Size: Large Drink: Cola The list of extras is 'SauceSaltPepper' SauceSaltPepper
스크립트에서 위치 매개변수 사용
- 특정 순서로 알려진 수의 인수/매개변수가 있을 때 사용
- 간단한 스크립트에 가장 적합
예
fastFoodOrder.sh
#!/bin/bash echo "Order: $1"; echo "Size: $2"; echo "Drink: $3";
이를 실행하려면 다음을 입력하십시오.
bash ./fastFoodOrder.sh 'Fish Burger Meal' Large Cola
그러면 스크립트가 다음과 같이 출력됩니다.
Order: Fish Burger Meal Size: Large Drink: Cola
옵션이 순서에 맞지 않게 제공된 경우 값이 모두 혼동될 수 있습니다. 이 방법을 사용하여 중요한 위치를 지정하십시오!
bash ./fastFoodOrder.sh 'Fish Burger Meal' Cola Large
값이 잘못 할당됨:
Order: Fish Burger Meal Size: Cola Drink: Large
루프를 사용하여 명령줄 매개변수 읽기
- 옵션/인수를 미리 알 수 없는 경우에 가장 잘 사용됩니다.
- 예를 들어 레시피의 재료 목록을 제공할 수 있습니다.
- 내장 변수 [email protected],을 사용합니다. 사용자가 제공한 모든 입력 옵션의 배열을 포함하는
예
레시피.sh
#!/bin/bash i=1; # This value is the iterator value - the current number of loops that have completed for ingredient in "[email protected]" # loop through [email protected] which is an array of all passed input parameters do echo "Ingredient number $i is $ingredient";# Print the $ingredient which was passed to the script when it was called i=$((i + 1)); # Increment the iterator value so we know how many times we have looped done
실행:
sh ./recipe.sh bread lettuce cheese hamburger
출력:
Ingredient number 1 is bread Ingredient number 2 is lettuce Ingredient number 3 is cheese Ingredient number 4 is hamburger