수색…


비고

  • shift$2$1 되고 $3$2 가되도록 위치 매개 변수를 왼쪽으로 이동합니다.
  • "$@" 는 스크립트 / 함수에 전달 된 모든 위치 매개 변수의 배열입니다.
  • "$*" 는 스크립트 / 함수에 전달 된 모든 위치 매개 변수로 구성된 문자열입니다.

여러 매개 변수 구문 분석

많은 매개 변수를 파싱하려면 우선 while 루프, case 문 및 shift를 사용하는 것이 좋습니다.

shift 는 계열에서 첫 번째 매개 변수를 팝하는 데 사용되어 $ 2로 사용 된 것을 $ 1로 만듭니다. 이는 한 번에 하나씩 인수를 처리 할 때 유용합니다.

#!/bin/bash

# Load the user defined parameters
while [[ $# > 0 ]]
do
        case "$1" in

                -a|--valueA)
                        valA="$2"
                        shift
                        ;;

                -b|--valueB)
                        valB="$2"
                        shift
                        ;;

                --help|*)
                        echo "Usage:"
                        echo "    --valueA \"value\""
                        echo "    --valueB \"value\""
                        echo "    --help"
                        exit 1
                        ;;
        esac
        shift
done

echo "A: $valA"
echo "B: $valB"

입력 및 출력

$ ./multipleParams.sh --help
Usage:
    --valueA "value"
    --valueB "value"
    --help

$ ./multipleParams.sh
A: 
B:

$ ./multipleParams.sh --valueB 2
A: 
B: 2

$ ./multipleParams.sh --valueB 2 --valueA "hello world"
A: hello world
B: 2

매개 변수 액세스

Bash 스크립트를 실행할 때 스크립트에 전달 된 매개 변수의 위치에 따라 이름이 지정됩니다. $1 은 첫 번째 매개 변수의 이름이고 $2 는 두 번째 매개 변수의 이름입니다.

누락 된 매개 변수는 단순히 빈 문자열로 평가됩니다. 매개 변수의 유무 확인은 다음과 같이 수행 할 수 있습니다.

if [ -z "$1" ]; then
    echo "No argument supplied"
fi

모든 매개 변수 얻기

$@$* 는 모든 스크립트 매개 변수와 상호 작용하는 방법입니다. Bash 맨 페이지 를 참조하면 다음과 같이 표시됩니다.

  • $* : 하나부터 시작하여 위치 매개 변수로 확장됩니다. 확장이 큰 따옴표 안에서 발생하면 각 매개 변수의 값이 IFS 특수 변수의 첫 번째 문자로 분리 된 단일 단어로 확장됩니다.
  • $@ : 하나부터 시작하여 위치 매개 변수로 확장됩니다. 확장이 큰 따옴표 안에 있으면 각 매개 변수가 별도의 단어로 확장됩니다.

매개 변수 수 얻기

$# 는 스크립트에 전달 된 매개 변수의 수를 가져옵니다. 일반적인 사용 사례는 적절한 수의 인수가 전달되었는지 확인하는 것입니다.

if [ $# -eq 0 ]; then
    echo "No arguments supplied"
fi

예제 1

모든 인수를 반복하고 파일인지 확인하십시오.

for item in "$@"
do  
    if [[ -f $item ]]; then
        echo "$item is a file"
    fi  
done

예제 2

모든 인수를 반복하고 파일인지 확인하십시오.

for (( i = 1; i <= $#; ++ i ))
do
    item=${@:$i:1}

    if [[ -f $item ]]; then
        echo "$item is a file"
    fi  
done

for 루프를 사용한 인수 구문 분석

옵션을 제공하는 간단한 예 :

고르다 Alt. 고르다 세부
-h --help 도움말보기
-v --version 버전 정보 표시
-dr path --doc-root path 보조 매개 변수 (경로)를 취하는 옵션
-i --install 부울 옵션 (true / false)
-* - 잘못된 옵션
#!/bin/bash
dr=''
install=false

skip=false
for op in "$@";do
    if $skip;then skip=false;continue;fi
    case "$op" in
        -v|--version)
            echo "$ver_info"
            shift
            exit 0
            ;;
        -h|--help)
            echo "$help"
            shift
            exit 0
            ;;
        -dr|--doc-root)
            shift
            if [[ "$1" != "" ]]; then
                dr="${1/%\//}"
                shift
                skip=true
            else
                echo "E: Arg missing for -dr option"
                exit 1
            fi
            ;;
        -i|--install)
            install=true
            shift
            ;;
        -*)
            echo "E: Invalid option: $1"
            shift
            exit 1
            ;;
    esac
done

래퍼 스크립트

래퍼 (Wrapper) 스크립트는 다른 기능을 제공하거나 그냥 지루한 작업을하기 위해 다른 스크립트 나 명령을 래핑하는 스크립트입니다.

예를 들어, 새로운 GNU / Linux 시스템의 실제 egrepegrep 라는 래퍼 스크립트로 대체되고 있습니다. 이것은 다음과 같습니다.

#!/bin/sh
exec grep -E "$@"

그래서 그런 시스템에서 egrep 을 실행할 때, 실제로 모든 인수가 전달 된 채로 grep -E 를 실행하고 있습니다.

일반적인 경우, 다른 스크립트 mexmp 와 함께 예제 스크립트 / 명령 exmp 를 실행하려면 wrapper mexmp 스크립트는 다음과 같습니다.

#!/bin/sh
exmp "$@" # Add other options before "$@"
# or 
#full/path/to/exmp "$@"

배쉬에서 배열로 문자열을 나눕니다.

String 매개 변수가 있고 쉼표로 구분하려고한다고 가정 해 보겠습니다.

my_param="foo,bar,bash"

이 문자열을 쉼표로 구분하려면 사용할 수 있습니다.

IFS=',' read -r -a array <<< "$my_param"

여기서 IFS는 내부 필드 구분 기호 라는 특수 변수로 일부 작업을 위해 패턴을 토큰으로 분리하는 데 사용되는 문자를 정의합니다.

개별 요소에 액세스하려면 :

echo "${array[0]}"

요소를 반복하려면 다음을 수행하십시오.

for element in "${array[@]}"
do
    echo "$element"
done

인덱스와 값을 모두 얻으려면 :

for index in "${!array[@]}"
do
    echo "$index ${array[index]}"
done


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow