위치매개 변수
인지, 특수매개 변수
인지 사실 별로 중요하지 않습니다.#!/bin/bash if [ $# -ne 3 ] then echo "plz check arguments again" else echo "$0 script is running" fi
코드에 보이는 '$#'
과 '$0'
와 같이 달러 표시로 시작되는 것들이 내부적으로 지정되어 있는 변수입니다.
'$#'
은 넘겨진 아규먼트 개수
를 '$0'
은 실행된 셸 스크립트명
을 의미해요스크립트의 내용은 넘겨진 아규먼트의 개수가 3개가 아니라면 "plz check arguments again"
을 출력하고
3개가 맞다면 "00 script is running"
을 출력하라는 간단한 코드입니다 :)
student@nasa1515:/home/won/script$ ./nasa.sh a b ### 아규먼트 갯수를 2개로 지정 plz check arguments again student@nasa1515:/home/won/script$ student@nasa1515:/home/won/script$ ./nasa.sh a b c ### 아규먼트 갯수를 3개로 지정 ./nasa.sh script is running
위와 같이 아규먼트의 개수
를 담고 있는 '$#'
처럼 편의성을 위해 정의되어 있는 변수들을 특수변수
라고 합니다.
이전 포스트인 정규표현식과 동일합니다.
각 숫자들은 우리가 어떤 명령을 내릴 때, 띄어쓰기
기준으로 그 위치에 해당하는 값들을 가져옵니다.
그래서 $숫자
형태를 위치매개변수
라고 합니다.
추가적인 팁으로 10번째부터는 ”{}“로 감싸줘야 합니다. ex) ${10}
#!/bin/bash echo '$0' value : $0 echo '$1' value : $1 echo '$2' value : $2 echo '$3' value : $3 echo '$#' value : $# echo '$*' value : $* echo '$@' value : $@
student@nasa1515:/home/won/script$ ./nasa1515.sh int1 int2 int3 $0 value : ./nasa1515.sh $1 value : int1 $2 value : int2 $3 value : int3 $# value : 3 $* value : int1 int2 int3 $@ value : int1 int2 int3
$*
와 $0
는 결과처럼 동일한 것처럼 보입니다. 보통 쌍따옴표
로 묶어주지 않으면 동일한 기능을 수행합니다.
# 아래와 같이 간단한 스크립트를 하나 만들었습니다. #!/bin/bash echo '1."$@"GO---------------------------------------' for i in "$@" do echo $i done echo "" echo '2."$*"GO---------------------------------------' for i in "$*" do echo $i done
student@nasa1515:/home/won/script$ ./test.sh aaa bbb ccc ddd fff 1."$@"GO--------------------------------------- aaa bbb ccc ddd fff 2."$*"GO--------------------------------------- aaa bbb ccc ddd fff
결과로 보이듯이 "" ""
로 변수가 묶인 경우 저장되어있는 개 개의 값이 전개되는 것이 다릅니다.
더 쉽게 예를들어 받는 값이 "aaa" "bbb" "ccc"
(※ set “aaa” “bbb” “ccc”) 일 때
”$@”
"aaa" "bbb" "ccc"
처럼 전개됩니다.
”$*”
"aaa bbb ccc"
처럼 전개됩니다.
특수매개변수가 꼭 아규먼트와 관련된 변수만 있는 것은 아닙니다.
아규먼트 변수 외에도 아래와 같은 다양한 정보를 알 수 있는 변수들이 있습니다
$$
uniq_id=$$`date +%Y%m%d%H%M%S` echo ${uniq_id}
student@nasa1515:/home/won/script$ uniq_id=$$`date +%Y%m%d%H%M%S` student@nasa1515:/home/won/script$ echo ${uniq_id} 395820200819162509 student@nasa1515:/home/won/script$ echo $$ 3958
$?
student@nasa1515:/home/won/script$ echo "test" test student@nasa1515:/home/won/script$ echo $? 0 student@nasa1515:/home/won/script$ student@nasa1515:/home/won/script$ llls llls: 명령을 찾을 수 없습니다 student@nasa1515:/home/won/script$ echo $? 127
보통 if문의 결과값을 확인하기위해 많이 사용됩니다.
$!
백그라운드로 실행된 명령의 pid 입니다
실습을 위해 아래같은 스크립트를 하나 만들었습니다.
#!/bin/bash echo value: $$ sleep 10 echo finish
student@nasa1515:/home/won/script$ ./aa.sh & [1] 9007 student@nasa1515:/home/won/script$ value: 9007 finish [1]+ 완료 ./aa.sh
다음과 같이 정상적으로 백그라운드로 실행된 PID를 출력합니다
이후에 다시 $!
을 출력해보더라도 동일한 PID 출력됩니다.
student@nasa1515:/home/won/script$ echo $! 9007
$_
$ echo AA BB AA BB $ echo $_ BB