- echo
- read
- printf
- 실습
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
'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 |