Shell Script

Shell Script 기초(5)

사실 나도 모름 2023. 11. 24. 05:15
  1. echo
  2. read
  3. printf
  4. 실습

1. echo

print text to standard output 해석하자면 텍스트를 표준 출력으로 나타내라는 의미다.

echo 는 우리가 텍스트를 화면에 출력하기 위해 사용한다.

 

사용방법 : echo [옵션] [문자열]

 

옵션

 

echo 명령을 이용할 때 다음 옵션과 함께 이용할 수 있다.

  • -n : 메시지 출력 후 newline 문자를 추가하지 않는다.
  • -E : Escape 시퀀스를 무시하고 그대로 출력한다(기본값).
  • -e : Escape 시퀀스를 해석하여 특별한 의미를 지정한다.
Escape 시퀀스
\\ backslash
\a alert (BEL)\
\b backspace
\c produce no further output
\e escape
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\0NNN byte with octal value NNN (1 to 3 digits)
\xHH byte with hexadecimal value HH (1 to 2 digits)

 

 

 

 


2. Read

사용자로부터 입력을 읽어들이는 데 사용되는 명령어다.

일반적으로 스크립트나 셸 프로그램에서 상호작용적인 부분을 처리할 때 주로 사용된다.

 

사용방법 : read  [옵션]

 

옵션

 

read 명령을 이용할 때 다음 옵션과 함께 사용할 수 있다.

다음은 리눅스 read --help 의 한글 번역 결과다.

read: read [-ers] [-a 배열] [-d 구분자] [-i 텍스트] [-n 문자수] [-N 문자수] [-p 프롬프트] [-t 타임아웃] [-u 파일디스크립터] [이름 ...]
    표준 입력에서 한 줄을 읽어 필드로 분할합니다.

    표준 입력 또는 -u 옵션이 제공된 경우 파일 디스크립터 FD에서 한 줄을 읽습니다. 줄은 단어 분할과 같이 필드로 나뉘며, 첫 번째 단어는 첫 번째 NAME에 할당되고, 두 번째 단어는 두 번째 NAME에 할당되며, 나머지 단어는 마지막 NAME에 할당됩니다. $IFS에 포함된 문자만 단어 구분자로 인식됩니다.

    NAME이 제공되지 않으면 읽은 줄은 REPLY 변수에 저장됩니다.

    옵션:
      -a 배열   읽은 단어를 배열 변수 ARRAY의 연속적인 인덱스에 할당합니다 (0부터 시작)
      -d 구분자   줄이 새 줄이 아닌 DELIM의 첫 번째 문자가 읽힐 때까지 계속됩니다.
      -e        Readline을 사용하여 줄을 얻습니다.
      -i 텍스트   Readline의 초기 텍스트로 TEXT를 사용합니다.
      -n 문자수   줄 바꿈 문자 대신 NCHARS 문자를 읽은 후 반환합니다. 그러나 구분자가 읽히기 전에 NCHARS보다 적은 문자가 읽히면 구분자를 고려합니다.
      -N 문자수   정확히 NCHARS 문자를 읽은 후에만 반환하며, EOF가 나타나거나 읽기가 제한 시간을 초과하면 구분자를 무시합니다.
      -p 프롬프트   읽기 전에 줄 바꿈이 없는 상태에서 문자열 PROMPT를 출력합니다.
      -r        백슬래시가 어떤 문자도 이스케이프하는 것을 허용하지 않습니다.
      -s        터미널에서 입력된 내용을 표시하지 않습니다.
      -t 타임아웃    제한 시간이 지나면 타임아웃이 발생하여 실패로 반환하며, TIMEOUT 초 내에 완전한 줄이 읽히지 않으면 타임아웃합니다. TMOUT 변수의 값이 기본 타임아웃입니다. TIMEOUT은 소수일 수 있습니다. TIMEOUT이 0이면 읽기를 시도하지 않고 지정된 파일 디스크립터에서 입력이 사용 가능하면 즉시 성공으로 반환합니다. 타임아웃이 초과되면 종료 상태는 128보다 큽니다.
      -u 파일디스크립터   표준 입력 대신 파일 디스크립터 FD에서 읽습니다.

    종료 상태:
    반환 코드는 파일의 끝이 나타나거나 읽기가 제한 시간을 초과하면(이 경우 128보다 큼), 변수 할당 오류가 발생하거나 잘못된 파일 디스크립터가 -u에 인수로 제공되면 0입니다.

 


예제
# name 이라는 변수에 값 입력받기
read name

# score 라는 변수에 입력시간제한 5초 걸기(타임아웃되면 빈 문자열이 입력됨)
read -t5 score

# class 라는 변수에 입력 문자 개수제한 1개로 걸기
read -n1 class

# pass 라는 변수에 입력하는 문자를 화면에 표시하지 않기
read -s pass

# echo와 read 조합1
echo -n "your name : " ; read name

# echo와 read 조합2
echo -n "continue(y/n)? " ; read answer

 

 

 

 


3. printf

printf 명령은 형식화된 문자열을 출력하는 데 사용되는 명령어다.

이 명령어는 C 프로그래밍 언어의 printf 함수와 유사한 방식으로 동작한다.

printf는 여러 인수를 받아서 지정된 형식에 따라 문자열을 생성하고 출력한다.

 

사용방법 : printf FORMAT [ARGUMENT]...

 

서식 지정자
서식 지정자
%s 문자열
%d, %i 10진수 정수
%f 부동 소수점 수
%c 문자
%x, %X 16진수

 

 

예제
# 줄바꿈을 해주는 \n
printf "Hello linux shell \n"

# 서식 지정자를 이용한 printf 사용
printf "Name: %s\tScore: %i\n" kim 90

# 변수를 활용한 printf
today=`date +%Y%m%d`
printf "Today is %s\n" $today

# 서식 지정자로 자릿수를 맞춰서 출력
printf "|%10s|%10s|%10.2f|\n" apple orange 20

# 위 결과를 왼쪽부터 배치
printf "|%-10s|%-10s|%-10.2f|\n" apple orange 20

 

 

 

 


4. 실습

input-exam.sh
### input-exam.sh 아래 내용부터 입력
#!/bin/bash
#: Usage		: input-exam.sh
#: Author		: apple
echo -n "Input a directory name : "
read dirName
echo "======================================"
date +%Y-%m-%d
echo "======================================"
du -sh $dirName 2> /dev/null
echo

# 실행 결과
Input a directory name : /home
======================================
2023-11-23
======================================
136K    /home

 

사용자에게 디렉토리 이름을 입력받아 해당 디렉토리의 용량을 표시하는 스크립트다.

 

 

input-exam2.sh
#!/bin/bash
#: Usage        : input-exam.sh
#: Description  : Save the file list of the entered directory to /tmp.
echo -n "Directory Name or Path : "
read dirName
ls -al "$dirName" > /tmp/$(date +%Y%m%d).txt

실행 결과

사용자에게 디렉토리 경로를 입력받아 해당 디렉토리 내 리스트 출력정보를 /tmp에 파일로 저장하는 스크립트다.

 

 


여기서 실험을 해보다가 재미있는 사실을 발견했다.

입력받은 디렉토리 경로를 명령어가 인식하는 과정에서 '~/bin'이라는 경로는 인식하지 못한다.

즉, '~' 문자에 대해서는 홈 디렉토리라는 의미대로 해석하지 않고 문자로만 취급한다는 것이다.

결론적으로 '~/bin' 은 입력을 하더라도 정상적인 실행이 되지 않는다.

 

이 내용에 대해서는 문제가 조금 복잡해지므로 따로 글을 작성하겠다.

 

 


 

아래 영상을 참고했습니다.

https://youtube.com/playlist?list=PLApuRlvrZKog2XlvGJQh9KY8ePCvUG7Je&si=zHelXxhBCkliPb4d

 

[따배셸] 셸 프로그래밍 시리즈

 

www.youtube.com

 

'Shell Script' 카테고리의 다른 글

Shell Script 기초(6)  (0) 2023.11.27
Shell Script 보안 - 코드 인젝션 취약점  (0) 2023.11.24
Shell Script 기초(4)  (0) 2023.11.24
Shell Script 기초(3)  (0) 2023.11.23
Shell Script 기초(2)  (0) 2023.11.22