[쉘 스크립트] 쉘 스크립트 기초 - 사용자 입력 처리 (4)

업데이트:     Updated:

카테고리:

태그:

🎯사용자 입력 처리

매개변수 전달

$ ./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)


👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

Linux 카테고리 내 다른 글 보러가기

댓글남기기