**해당 포스트는 Ubunto 22.04와 xShell을 기반으로 진행한 포스팅입니다.
1. 로컬 변수와 환경 변수 설정
로컬 변수(Local Variable) - 소문자로 표기
: 현재 셸 세션에서만 사용되는 변수로, 새로 셸을 실행시킨 후에는 사용이 불가능하다.
root@ubunto:~# var1="hello" // 로컬 변수 선언
root@ubunto:~# echo var1 // 로컬 변수 호출
hello
root@ubunto:~# bash //새로운 shell 실행
root@ubunto:~# echo var1 // 실행 불가
환경 변수(Environment Variable) - 대문자로 표기
: 운영 체제나 시스템의 실행 환경에서 설정된 변수로, 시스템이나 세션 전체에서 접근이 가능하며, 새로 셸을 실행한 후에도 사용이 가능하고, 프로그램이나 스크립트에서도 참조할 수 있다.
//환경 변수 보기
printenv
env
//export를 이용하여 환경 변수 설정 가능
export 변수이름=값
export MY_VAR="Hello, World!"
echo $MY_VAR
대표적인 환경 변수들은 다음과 같다.
- PATH: 실행 파일을 찾는 디렉토리 경로 목록, 해당 변수가 없으면 명령어 실행이 불가능하다.
- HOME: 현재 사용자의 홈 디렉토리 경로
- USER: 현재 로그인한 사용자의 이름
- SHELL: 현재 사용 중인 셸의 경로
2. 인용(Quoating)
Quoating은 특수 문자나 공백을 포함한 문자열을 안전하게 다루기 위해 사용된다. 쉽게 말하면 특수 문자나 공백이 내가 의도한 방향으로 해석되도록 하기 위해 quoating을 사용하는 것이다.
대표적인 Quoating 방법은 "(큰따옴표), '(작은 따옴표), \(백슬래쉬)가 있다. 세 방법 다 기능에 조금씩 차이가 있기 때문에 다음 설명을 참고하여 모두 알고 사용할 수 있도록 하자.
1. " (큰 따옴표)
:변수 선언, $, `(백틱), \ 등의 확장을 허용하지만, 공백이나 일반적인 특수 문자열은 일반 문자열로 처리한다.
echo "Hello, $USER"
Hello, root
2. ' (작은 따옴표)
: 작은 따옴표로 묶은 문자열을 문자열(literal) 그대로 출력한다. 말 그대로 모든 특수 문자를 무시하는 것이다.
echo "Hello, $USER"
Hello, $USER
3. \ (백 슬래쉬)
: 백 슬래쉬 뒤에 오는 특수 문자의 의미를 무효화하고, 해당 문자를 문자 그대로 해석한다.
echo "Hello, \$USER"
Hello, $USER
돌발 실습) ***이라는 이름을 갖는 디렉토리를 다양한 Qouating 방법을 활용하여 만들어보자!
3. 리다이렉션(Redirection)
리다이렉션(Redirection)이란 Linux/Unix에서 명령의 입력과 출력의 방향을 변경하는 기능이다. Linux/Unix의 기본적인 입력은 키보드, 출력은 터미널이지만, 리다이렉션을 사용하면 특정 파일 또는 장치로 입/출력을 재설정 가능하다. 리다이렉션의 종류를 알아보면서 더 자세히 이해해 보자.
리다이렉션의 종류는 다음과 같다.
출력 리다이렉션
- > : 출력 결과를 지정한 파일에 저장하고, 기존 내용은 덮어쓴다. = 1>
- >> : 출력 결과를 지정한 파일에 추가한다(덮어쓰지 않음).
- 2> : 표준 오류 출력을 리다이렉션 한다.
- &> : 표준 출력과 오류를 모두 리다이렉션 한다. = > 지정한 파일 2>&1
echo "Hello, World!" > output.txt //output.txt 파일에 "Hello, World!"가 저장되고, 기존 내용은 덮어씌워진다
echo "Hello again!" >> output.txt
ls non_existent_file 2> error.txt //에러 메시지가 error.txt에 저장
command &> output.txt //명령의 모든 출력이 output.txt에 저장
echo "쓰레기통으로 보냅니다" > /dev/null 2>1&
/*
/dev/null은 리눅스에서 쓰레기통과 같은 디렉토리이다.
모든 출력 결과를 해당 디렉토리로 보내게 되면 터미널에 불필요하게 출력되는 결과를 없앨 수 있다
*/
여기서 1, 2는 어떤 의미를 가지는 숫자일까?
간략하게 설명하면, 0, 1, 2는 표준 I/O/Error 에 대한 파일 디스크립터이다. 먼저 표준 입출력은 운영 체제에서 프로그램의 입력과 출력의 흐름을 관리하는 기본적인 방식이다. 명령어를 입력했을 때, 쉘과 커널에서 명령어를 처리하고, 출력하는 과정을 그림으로 설명하면 다음과 같다.
리눅스에서는 이와 같은 과정에서 표준 IO 스트림(화살표)을 파일 디스크립터라는 개념으로 분류하고, 이를 통해 관리한다. 표준 I/O/Error에 대한 파일 디스크립터를 정리하면 다음과 같다.
표준 입력 (stdin) | 0 | 기본 입력 스트림 |
표준 출력 (stdout) | 1 | 기본 출력 스트림 |
표준 오류 (stderr) | 2 | 오류 출력 스트림 |
다시 리다이렉션으로 돌아와 리다이렉션의 종류를 해석해 보면 >은 1>에서 1이 생략된 것으로 표준 출력 결과를 리다이렉션 한다고 볼 수 있고, 2>는 표준 오류의 결과를, &>는 2>&1으로도 사용 가능하며 표준 출력과 오류의 결과를 리다이렉션한다고 볼 수 있다. 즉, 파일 디스크립터를 명시하여, 어떤 스트림을 리다이렉션 할지 정한다고 보면 된다(=터미널이 아닌 어디로 결과값을 보낼지).
리다이렉션의 경우 실행 결과나 오류 로그를 기록하고, 자동화 스크립트를 작성하는데 유용하게 사용되기 때문에 잘 알아두도록 하자.
4. 파이프라인(|)
파이프라인(|)은 한 명령어의 출력을 다른 명령어의 입력으로 전달하는 데 사용된다. 예시를 통해 이해해 보자.
cat /etc/passwd | grep root
// /etc/passwd 파일의 내용을 출력(cat)하고, 그중에서 "root"라는 단어가 포함된 줄만 검색(grep)
ls -l | grep txt
// 현재 디렉토리의 파일 목록(ls -l) 중 "txt"가 포함된 항목만 출력
tail -n 50 /var/log/syslog | grep error
// 시스템 로그 파일에서 마지막 50줄만 출력(tail)하고, 그중에서 "error"라는 단어가 포함된 줄을 검색
돌발 실습) /bin 이라는 디렉토리에서 nt를 포함하는 명령어를 추려 오름차순으로 정렬한 후, nt-word.txt.라는 파일에 저장하는 명령문을 작성하라.
ls /bin | grop nt | sort > nt-word.txt
힘들지만 오늘도 해낸 나를 위한 한 마디,
"가장 만족스러웠던 날을 생각해 보라. 그날은 아무것도 하지 않고 편히 쉬기만 한 날이 아니라, 할 일이 태산이었는데도, 결국은 그것을 모두 해낸 날이다", Margaret Thatcher
'System > Shell Script' 카테고리의 다른 글
[쉘 스크립트] select, while, until (0) | 2024.11.18 |
---|---|
[쉘 스크립트] sed, if, read, case (1) | 2024.11.18 |
[쉘 스크립트] $는 어떤 용도로 쓰일까? (0) | 2024.11.16 |