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