본문 바로가기

스터디/리눅스 커맨드라인

[리눅스] 32. 위치 매개변수

 

앞장에서 만든 프로그램에서 한 가지 놓치고 있는 기능은 커맨드라인 옵션과 인자를 허용하고 처리하는 능력이다.
이번 장에서는 커맨드라인의 내용에 접근하는 쉘 기능을 알아볼 것이다.

 

 

1. 커맨드라인 항목 접근

쉘은 위치 매개변수라는 변수의 집합을 제공한다. 그것은 커맨드라인 명령의 개별 요소들을 가지고 있으며 변수들은 0부터 9까지 이름 붙인다. 아래와 같은 방식으로 나타낼 수 있다.
# posit-param

\$0 = $0
\$1 = $1
\$2 = $2
.
.
.
\$9 = $9​


커맨드라인 인자 없이 위의 스크립트를 실행하면 다음과 같다.

$ posit-param

$0 = /home/me/bin/posit-param
$1 =
$2 = 
.
.
.
$9 =

인자가 없는 경우조차도 $0은 항상 커맨드라인의 첫 번째 항목을 가지고 있다. 그것은 바로 실행되고 있는 프로그램의 경로명이다.

다음은 인자를 입력하는 것이다.

$ posit-param a b c d

$0 = /home/me/bin/posit-param
$1 = a
$2 = b
$3 = c
$4 = d
$5 =
.
.
.
$9 =


(1) 인자 수 확인

$ posit-param a b c d

Number: 4

$0 = /home/me/bin/posit-param
$1 = a
$2 = b
$3 = c
$4 = d
$5 =
.
.
.
$9 =

커맨드라인 스크립트에 Number 변수의 value에 $# 을 입력해야한다.

(2) shift - 다수의 인자에 접근

count=1

while [[ $# -gt 0 ]]; do
       echo "Argument $count = $1"
       count=$((count + 1))
       shitf
done

shift가 실행될 때마다 $2의 값은 $1로, $3의 값은 $2로 이동한다. 또한, $#의 값은 1씩 감소한다.

위의 프로그램은 남은 인자 수를 확인하고 인자가 남는 한 계속되는 루프를 만든다. 현재 인자를 표시하고, 처리된 인자 수를 세기 위해 변수 count는 루프를 반복할 때마다 증가한다.

 

 

2. 위치 매개변수 전체 제어

우리가 다른 프로그램을 감싸는 래퍼(wrapper)를 작성하기를 원한다면, 그 프로그램의 실행을 간소화하는 스크립트나 쉘 함수를 만든다는 것을 의미한다.
래퍼는 커맨드라인 옵션 목록을 공급하고 나서 인자 목록을 하위 레벨 프로그램에 전달한다.
(1) 특수 매개변수
$* : 항목 1부터 시작하여 위치 매개변수 목록으로 확장된다. 쌍 따옴표로 둘러싸면, 쌍 따옴표 내의 문자열 모두가 위치 매개변수로 확장되고 각각 IFS 쉘 변수의 첫 번째 문자에 의해 구분된다.
$@ : 항목 1부터 시작하여 위치 매개변수 목록으로 확장된다. 이것을 쌍 따옴표로 둘러싸면, 각 위치 매개변수는 쌍 따옴표로 구분된 단어로 확장된다.

# posit-param

print_param() {
   echo "\$1 = $1"
   echo "\$2 = $2"
   echo "\$3 = $3"
   echo "\$4 = $4"
}

pass_param () {
   echo -e "\n" '$* :'; print_param $*
   echo -e "\n" '"$*" :'; print_param "$*"
   echo -e "\n" '$@ :'; print_param $@
   echo -e "\n" '"$@" :'; print_param "$@"
}

pass_param "word: "words with spaces"​

 

위 프로그램은 word와 word with spaces라는 두 인자를 만들고 pass_param함수에 전달한다.

그 결과는
$* :
$1 = word
$2 = words
$3 = with
$4 = sapces

"$*" :
$1 = word words with spaces
$2 = 
$3 = 
$4 = 

$@ :
$1 = word
$2 = words
$3 = with
$4 = spaces

"$@" :
$1 = word 
$2 = words with spaces
$3 = 
$4 =​
$*와 $@는 모두 네 단어를 생성한다.
"$*"는 word words with spaces라는 한 단어를 생성한다.
"$@"는 word와 words with spaces 두 단어를 생성한다.

 

 

3. 완전한 응용 프로그램

출력 파일 : 프로그램 출력을 저장할 파일명을 지정하기 위한 옵션을 추가하는 것이다. (-f file, --file file)
대화식 모드 : 출력 파일명을 사용자에게 표시하고 그 파일의 존재 여부를 확인한다. 만약 존재한다면 사용자에게 해당 파일을 덮어쓰기 전에 물어본다. (-i, --interactive)
도움말 : 사용법이 표시된다. (-h, --help)

'스터디 > 리눅스 커맨드라인' 카테고리의 다른 글

[리눅스] 35. 배열  (0) 2022.08.15
[리눅스] 33. 흐름 제어: for 루프  (0) 2022.08.08
[리눅스] 31. case 분기  (0) 2022.08.01
[리눅스] 30. 문제 해결  (0) 2022.07.25
[리눅스] 28. 키보드 입력 읽기  (0) 2022.07.17