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

Shell/Bash 스크립트의 명령줄 인수 [자습서]

이 자습서에서는 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