[쉘 스크립트] 쉘 스크립트 기초 - 사용자 입력 처리 (4)
카테고리: Linux
태그: Linux
🎯사용자 입력 처리
매개변수 전달
$ ./addem.sh 10 30
매개변수 읽기
$0: 스크립트 이름 (./addem.sh)$1: 첫 번째 매개변수 (10)$2: 두 번째 매개변수 (30)${10}: 아홉 번째 매개변수 이후에는 번호를 중괄호로 감싸야 한다.- 커맨드라인 매개변수를 입력 시 각 매개변수는 빈 칸으로 구분된다.
- 빈 칸이 포함된 매개변수를 입력하려는 경우 겹따옴표(“”) 또는 홀따옴표(‘‘)로 묶어야 한다.
스크립트 이름 읽기
쉘이 커맨드라인에서 실행시킨 스크립트의 이름을 판단하기 위해 $0 매개변수를 사용하는 경우 잠재적인 문제를 갖고있다.
다음의 예제는 스크립트를 실행시키는 방법에 따른 $0 매개변수가 가리키는 값을 나타낸다.
$ cat parameterName.sh
#!/bin/bash
echo The zero parameter is set to: $0
$ ./parameterName.sh
The zero parameter is set to: ./parameterName.sh
$ /root/bashscript/parameterName.sh
The zero parameter is set to: /root/bashscript/parameterName.sh
$0매개변수 값으로 스크립트를 실행시킨 전체 스크립트 경로가 포함된다.- 전체 스크립트 경로를 제외한 스크립트 이름만 추출하기 위해 사용할 수 있는
basename명령이 있다. - 다음은
basename명령을 사용하는 예이다.
$ cat parameterName.sh
#!/bin/bash
name=$(basename $0)
echo The zero parameter is set to: $name
$ ./parameterName.sh
The zero parameter is set to: parameterName.sh
$ /root/bashscript/parameterName.sh
The zero parameter is set to: parameterName.sh
특수한 매개변수
커맨드라인 매개변수를 추적할 수 있는 특별한 bash 쉘 변수를 소개한다.
매개변수 개수
$#: 스크립트를 실행할 때의 커맨드라인 매개변수의 개수가 포함되어 있다. 변수처럼 스크립트의 아무 위치에서나 사용할 수 있다.
$ cat parameterCount.sh
#!/bin/bash
echo There were $# parameters supplied.
$ ./parameterCount.sh 1
There were 1 parameters supplied.
$ ./parameterCount.sh 1 2
There were 2 parameters supplied.
모든 매개변수 읽기
커맨드라인에 제공되는 모든 매개변수를 한꺼번에 얻어야 할 때 얼마나 많은 매개변수가 커맨드라인에 있는지 판단하고 이들 모두를 순서대로 되풀이하기 위해 $*, $@ 매개변수를 사용할 수 있다.
$*: 커맨드라인에 제공되는 모든 매개변수를 하나의 단어로 가지고 있다.$@: 커맨드라인에 제공되는 모든 매개변수를 분리된 단어로 가지고 있다.- 다음의 예제는
$*와$@매개변수의 차이를 보여준다.
$ cat parameterDifference
#!/bin/bash
echo
count=1
for param in "$*"
do
echo "\$* Parameter #$count = $param"
count=$[ $count + 1 ]
done
echo
count=1
for param in "$@"
do
echo "\$@ Parameter #$count = $param"
count=$[ $count + 1 ]
done
$ ./parameterDifference rich barbara katie jessica
$* Parameter #1 = rich barbara katie jessica
$@ Parameter #1 = rich
$@ Parameter #2 = barbara
$@ Parameter #3 = katie
$@ Parameter #4 = jessica
시프트
shift명령을 사용하면 기본적으로 각 매개변수를 하나씩 왼쪽으로 옮긴다. 따라서$3의 값은$2으로 옮겨가고$2의 값은$1로 옮겨가고$1의 값은 사라진다. (스크립트 이름을 뜻하는$0은 변하지 않는다.)shift명령은 매개변수를 제공해서 여러 자리씩 시프트 시킬 수도 있다. 시프트 시키고 싶은 자릿수 만큼의 숫자를 제공하면 된다.
# TODO 1. basic shift
$ cat parametersShift.sh
#!/bin/bash
echo
count=1
while [ -n "$1" ]
do
echo "Parameter $count = $1"
count=$[ $count + 1]
shift
done
$ ./parametersShift.sh rich brabara katie jessica
Parameter 1 = rich
Parameter 2 = brabara
Parameter 3 = katie
Parameter 4 = jessica
# TODO 2. shift 2
$ cat parametersShift2.sh
#!/bin/bash
echo
echo "The original parameters: $*"
shift 2
echo "Here's the new first parameter: $1"
$ ./parametersShift2.sh 1 2 3 4 5
The original parameters: 1 2 3 4 5
Here's the new first parameter: 3
사용자 입력
스크립트는 실행되는 동안 질문을 하고 스크립트를 실행하는 사람의 응답을 기다리는 형태로 구현할 수 있다.
bash 쉘은 이 목적을 위해 read 명령을 제공한다.
read
read명령은 표준 입력 또는 다른 파일 디스크립터에서 하나의 입력을 받아들인다. 입력을 받은 뒤 read 명령은 데이터를 변수에 저장한다.read명령은-p옵션을 포함하여 입력 라인에 메시지를 출력할 수 있다.read명령은 프롬프트에 입력한 모든 데이터를 하나의 변수 또는 여러 변수에 지정할 수 있다. 변수 목록이 부족하면 나머지 데이터는 마지막 변수에 할당된다.read명령은 어떤 변수도 지정하지 않을 수 있다. 이렇게 하면read명령은 특수한 환경 변수인REPLY에 입력 받은 모든 데이터를 저장한다.REPLY환경 변수는 입력된 모든 데이터를 포함하고, 다른 변수들처럼 쉘 스크립트에서 사용될 수 있다.read명령은-t옵션을 사용하여 입력을 기다리는 시간을 제한할 수 있다. 지정된 시간을 초과하는 경우read명령은 0이 아닌 종료 상태를 돌려준다.read명령은-n옵션을 사용하여 입력의 길이를 제한할 수 있다.read명령은-s옵션을 사용하여 입력된 데이터를 모니터에 표시하지 못하도록 막을 수 있다. 실제로 데이터는 표시되지만 read 명령은 텍스트의 색깔을 배경색과 같게 설정한다.- 리눅스 시스템에서 파일에 저장된 데이터를 읽어 들일 때에도
read명령을 사용할 수 있다.read명령을 한 번 부를 때마다 파일에서 텍스트 한 줄을 읽어 들이고 더 이상 파일에 읽을 줄이 남아 있지 않을 때에read명령은 0이 아닌 종료 상태를 돌려준다.
# TODO 1. read 명령은 입력된 데이터를 변수에 저장한다.
$ cat read1.sh
#!/bin/bash
echo -n "Enter your name: "
read name
echo "Hello $name, welcome to my program. "
$ ./read1.sh
Enter your name: gangdongguri
Hello gangdongguri, welcome to my program.
# echo 명령에 -n 옵션을 사용하는 경우 출력 줄의 끝에 줄바꿈 문자를 표시하지 않음으로써 사용자가 다음 줄에 입력하는 대신 문자열 바로 옆에 데이터를 입력할 수 있다.
# TODO 2. read -p
$ cat read2.sh
#!/bin/bash
read -p "Enter your name: " name
echo "Hello $name, welcome to my program. "
$ ./read2.sh
Enter your name: gangdongguri
Hello gangdongguri, welcome to my program.
# TODO 3. read 명령은 여러 변수에 데이터를 저장할 수 있다.
$ cat read3.sh
#!/bin/bash
read -p "Enter your name: " first last
echo "Hello $first $last, welcome to my program. "
$ ./read3.sh
Enter your name: kwon kwanghoon
Hello kwon kwanghoon, welcome to my program.
# TODO 4. REPLY 환경 변수 사용
$ cat read4.sh
#!/bin/bash
read -p "Enter your name: "
echo "Hello $REPLY, welcome to my program. "
$ ./read4.sh
Enter your name: gangdongguri
Hello gangdongguri, welcome to my program.
# TODO 5. read -t
$ cat read5.sh
#!/bin/bash
if $(read -t 5 -p "Enter your name: " name)
then
echo "Hello $name, Welcome to my script"
else
echo
echo "Sorry, too slow!"
fi
$ ./read5.sh
Enter your name: gangdongguri
Hello , Welcome to my script
$ ./read5.sh
Enter your name:
Sorry, too slow!
# TODO 6. read -n
$ cat read6.sh
#!/bin/bash
read -n1 -p "Do you want to continue [Y/N]? " answer
case $answer in
Y | y) echo
echo "fine, continue on...";;
N | n) echo
echo "OK, goodbye"
exit;;
esac
echo "This is the end of the script"
$ ./read6.sh
Do you want to continue [Y/N]? Y
fine, continue on...
This is the end of the script
# read 명령은 딱 1글자만 입력하면 곧바로 이를 변수에 저장하고 종료된다. <Enter> 키를 누를 필요가 없다.
# TODO 7. read -s
$ cat read7.sh
#!/bin/bash
read -s -p "Enter your password: " pass
echo
echo "Is your password really $pass? "
$ ./read7.sh
Enter your password:
Is your password really 1234?
# TODO 8. 파일에서 읽기
$ cat read8.sh
#!/bin/bash
count=1
cat text | while read line
do
echo "Line $count: $line"
count=$[ $count + 1]
done
echo "Finished processing the file"
$ ./read8.sh
Line 1: kwon
Line 2: kwang
Line 3: hoon
Finished processing the file
$ cat read9.sh
#!/bin/bash
count=1
while read line
do
echo "Line $count: $line"
count=$[ $count + 1]
done < text
echo "Finished processing the file"
$ ./read9.sh
Line 1: kwon
Line 2: kwang
Line 3: hoon
Finished processing the file
📖출처
리처드 블룸, 크리스틴 브레스, ⌜리눅스 커맨드라인 쉘 스크립트 바이블⌟, 스포트라잇북(2016)
👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄
댓글남기기