Bash
매개 변수를 사용한 스크립팅
수색…
비고
-
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 시스템의 실제 egrep
은 egrep
라는 래퍼 스크립트로 대체되고 있습니다. 이것은 다음과 같습니다.
#!/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