#!/bin/bash
# 최소한 10 개의 매개변수를 줘서 이 스크립트를 실행시키세요. 예를 들면,
# ./scriptname 1 2 3 4 5 6 7 8 9 10
echo
echo "스크립트 이름은 \"$0\"."
# 현재 디렉토리를 나타내는 ./ 가 추가되어 있죠.
echo "스크립트 이름은 \"`basename $0`\"."
# 경로명을 떼어 냅니다('basename' 참고).
echo
if [ -n "$1" ] # 테스트 할 변수를 쿼우트 해줬습니다.
then
echo "첫번째 매개변수는 $1" # # 을 이스케이프 시키기 위해서 쿼우트를 해 줘야 됩니다.
fi
if [ -n "$2" ]
then
echo "두번째 매개변수는 $2"
fi
if [ -n "$3" ]
then
echo "세번째 매개변수는 $3"
fi
# ...
if [ -n "${10}" ] # $9 보다 큰 매개변수는 {중괄호}로 감싸야 됩니다.
then
echo "열번째 매개변수는 ${10}"
fi
echo
exit 0
variable1_=$1_
# 이렇게 해주면 위치 매개 변수가 비어있더라도 에러를 막아줍니다.
critical_argument01=$variable1_
# 실제로 변수를 쓸 곳에서 다음처럼 해주면 에러 방지용 문자가 잘려 나갑니다.
variable1=${variable1_/_/} # $variable1_ 이 "_"로 시작할 때만 부효과(Side effects)가 있습니다.
# 9장에서 논의할 매개변수 치환중의 한 가지 방법을 써서 변경 패턴을 삭제해 줍니다.
# 좀 더 확실한 방법은 원하는 위치 매개변수가 넘어 왔는지 테스트를 해 보는 것입니다.
if [ -z $1 ]
then
exit $POS_PARAMS_MISSING
fi
- 성공여부와 상관없이 다음 명령어 실행
한 줄에 여러 명령어를 순서대로 배열할 때는 ;를 구분자로 사용합니다. 아래 명령어는 test를 만든 후에 test 디렉토리로 이동합니다.
&& - 성공한 경우에 다음 명령어 실행
&&의 의미
&&는 앞의 명령어가 실행되었을 때 성공한 경우에 다음 명령어를 실행합니다. ;와는 다릅니다. 예를들어보죠. 아래와 같은 명령어가 있을 때
1
|
mkdir test; cd test; touch abc
|
test 디렉토리가 이미 있어서 아래와 같은 상황이라고 해보죠.
mkdir test(실패); cd test; touch abc
이 경우 cd test가 실행되고, touch abc도 실행됩니다.
반면에 아래의 경우는 cd test와 touch abc가 실행되지 않습니다.
mkdir test(실패) && cd test && touch abc
성공&실패와 무관하게 연속적으로 실행해야 할 명령이 있을 때 ;를 씁니다. 이전 명령이 성공했을 때 다음 명령을 실행하려면 &&를 씁니다. 대체로 &&를 쓰는게 좋을 때가 많습니다. 좀 더 정확하게는 &&는 이전 명령어의 실행결과가 참(true)일 때만 다음 명령을 실행합니다. 아래 내용은 참고삼아 읽어보세요.
if test condition-true와 if [ condition-true ] 은 완전히 똑같은 표현입니다. [ 는 test 명령어를 부르는 토큰이기 때문에 ] 가 꼭 필요하진 않지만 새 버전의 bash 에서는 그래도 있어야 됩니다.
참고: test 명령어는 파일 타입을 테스트하거나 문자열을 비교해 주는 bash 내장 명령이기 때문에, Bash 스크립트안에서 test는 sh-utils 패키지의 일부분인 /usr/bin/test 외부 명령어를 부르지 않습니다. 비슷하게, [도 /usr/bin/test로 링크되어 있는 /usr/bin/[를 부르지 않습니다.
2) set 명령과 위치 매개변수
-> 위치 매개변수를 재설정하면 기존의 값들은 잃어버리게 된다
-> 모든 위치 매개변수의 설정을 해제하려면 'set --' 명령을 사용한다
-> $0는 언제나 스크립트 이름을 가리킨다
$ cat test
#!/bin/bash
echo The name of this script is $0
echo The arguments are $*
=> $*은 모든 위치 매개변수를 의미한다
set $(date)
echo The date is $2, $3, $6.
$ ./test a b c d
The name of this script is ./test
The arguments are a b c d
The date is 11., 21., KST.
$ cat test
#!/bin/bash
name=${1:?"requires an argument"}
echo Hello $name
=> 특수 변수 변경자인 :?는 $1이 값을 가지고 있는지 검사한다
=> 지정한 값이 없으면 스크립트를 종료하고 메시지를 출력한다
$ ./test
./test: line 2: 1: requires an argument
$ ./test aaa
Hello aaa
-> $*와 $@의 차이
=> $*와 $@의 의미는 큰 따옴표 안에서 사용되는 경우에만 서로 다르다
=> 큰 따옴표 안에 $*를 사용하는 경우에는 매개변수들이 단일 문자로 취급된다
=> $@를 큰 따옴표 안에 사용하면 매개변수들은 서로 분리된 문자로 인식된다
$ set 'aaa bbb' ccc ddd
$ for i in $*
> do
> echo $i
> done
aaa
bbb
ccc
ddd
$ set 'aaa bbb' ccc ddd
$ for i in "$*"
> do
> echo $i
> done
aaa bbb ccc ddd
> $*이 큰 따옴표 안에 들어있기 때문에 전체 매개변수를 하나의 문자열로 처리한다
$ set 'aaa bbb' ccc ddd
$ for i in $@
> do
> echo $i
> done
aaa
bbb
ccc
ddd
$ set 'aaa bbb' ccc ddd
$ for i in "$@"
> do
> echo $i
> done
aaa bbb
ccc
ddd
> $@가 큰 따옴표 안에 있으므로 각 위치 매개변수를 개개의 문자열로 처리한다
출처: https://linuxism.ustd.ip.or.kr/57 [linuxism]