[Linux] Shell 확장 6가지와 Shell 인용 3가지
echo 명령어를 사용해서 Shell 확장(Expansion)에 대해 알아 보겠습니다.
1. Shell 확장
Shell 확장(Expansion)이란 셸에서 프로그램을 실행하기 직전 사용자가 입력한 인자를 정해진 의미에 맞게 해석해서 입력 or 출력으로 전환하는 것을 의미합니다. 프로그램은 echo를 포함한 명령어와 쉘에서 실행하는 모든 기능과 명령어들을 의미합니다.
~]$ echo hello oooo
hello oooo
echo 명령어로 인수(or 인자: Argument)가 표시됩니다.
~]$ echo *
1 123test.txt TestFile.txt abc.12 abc123 gg1 gg1~ gg2 gg3 index.php1
index.php2 index.php2~ output.txt sort.txt
1.1 경로명 확장(Pathname Expansion)
와일드카드가 작동하는 메커니즘을 경로명 확장(Pathname Expansion)이라고 합니다.
~]$ ls
1 123test.txt TestFile.txt abc.12 abc123 gg1 gg1~ gg2 gg3 index.php1
index.php2 index.php2~ output.txt sort.txt
~]$ echo abc*
abc.12 abc123
~]$ echo *ndex*
index.php1 index.php2 index.php2~
# 중간에 애스터리스크를 넣을 경우입니다.
~]$ echo /usr/lib/*/sysctl.d
/usr/lib/*/sysctl.d
1.2 틸드 확장(Tilde Expansion)
주로 cd 명령어에서 많이 사용하는 틸드 확장(Tilde Expansion)은 틸드(~)를 사용합니다. echo에서도 동일한 사용이 가능합니다.
~]$ echo ~rocky/
/home/rocky/
1.3 산술 확장(Arithmetic Expansion)
~]$ echo $((2 + 2))
4
산술 확장은 산술 연산을 수행하며, 셸 프롬프트에서 계산기로 사용할 수 있습니다. 정수 확장만 지원하고 소수점은 지원하지 않습니다.
연산자 | 설명 |
---|---|
+ | 덧셈 |
- | 뺄셈 |
* | 곱셈 |
/ | 나눗셈(단, 확장은 정수 연산만 지원하므로 결과는 정수가 됩니다) |
% | Modulo, 간단히 “나머지”를 의미합니다 |
** | 제곱(승수) |
~]$ echo $(($((5**3)) * 2))
250
~]$ echo Hello $((7/2))
Hello 3
~]$# echo Hello $((7%2))
Hello 1
1.4 중괄호 확장(Brace Expansion)
중괄호 확장(Brace Expansion)은 중괄호가 포함된 여러 텍스트 문자열을 만들 수 있습니다.
~]$ echo TEST{A,B,C}GG
TESTAGG TESTBGG TESTCGG
~]$ echo TEST-{A,B,C}-GG
TEST-A-GG TEST-B-GG TEST-C-GG
중괄호 확장은 머리말(preamble)이라는 선행 영역과 후행 영역에 해당하는 postscript(추신)이 포함될 수 있습니다.
~]$ echo TEST-{A..G}
TEST-A TEST-B TEST-C TEST-D TEST-E TEST-F TEST-G
~]$ echo TEST-{g..a}
TEST-g TEST-f TEST-e TEST-d TEST-c TEST-b TEST-a
~]$ echo {001..20} 13 14 15
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 13 14 15
~]$ echo ABC-{A{1,2},B{3,4}}-DEF
ABC-A1-DEF ABC-A2-DEF ABC-B3-DEF ABC-B4-DEF
중괄호 확장의 용도는 디렉토리 목록을 만들 때 유용하게 사용할 수 있습니다. “년도-월” 형식으로 숫자 디렉토리를 만들 수 있습니다.
~]$ mkdir 2020-2021
~]$ cd 2020-2021
~]$ mkdir mkdir {2020..2021}-{01..12}
1.5 매개변수 확장(Parameter Expansion)
매개변수(영어: parameter 파라미터[*])란 변수의 특별한 한 종류입니다. 인풋으로 제공하는 여러 데이터 중에 하나를 가리키기 위해 사용됩니다.
~]# echo $USER
root
## 사용 가능 변수 목록 확인 ▼
printenv
## 매개변수 변수 이름이 틀릴 경우 빈 문자열이 출력됩니다.
~]# echo $SUER
~]#
1.6 명령 치환(Command Substitution)
명령 치환으로 명령어 출력을 확장으로 변경할 수 있습니다.
~]# ls $(which rsync)
/usr/bin/rsync
2. Shell 인용(Quoting)
달러 사인($)을 사용했을 때 “$100″으로 출력된 것이 아닌 “100”으로 출력됨을 알 수 있습니다. 인용을 사용해서 누락된 부분에 대한 출력이 가능합니다. 쉘은 원치 않는 확장을 차단하는 인용이라는 메커니즘을 제공합니다.
~]# echo Show Me The Money
Show Me The Money
~]# echo Show Me The Money $100
Show Me The Money 00
2.1 더블 쿼츠(Double Quotes)
더블 쿼츠를 사용해서 더블 쿼츠 안의 모든 특수 문자는 일반 문자로 적용 받습니다. 예외는 $
, \
(backslash) 및 `
(back-quote) 3개의 문자입니다.
더블 쿼츠 적용/미적용 | 설명 |
---|---|
$ \ ` | 쌍 따옴표 안에서 3개의 기호는 일반문자 예외 적용 받음. > 매개변수 확장[$], 산술 확장[$],명령어 치환[\]은 그대로 실행 |
적용 대상 | 단어 분할, 경로명 확장, 틸드(~) 확장, 괄호 확장을 숨길 수 있음. |
“05-06 access_log”이란 공백이 있는 파일을 확인해야 하는 경우 단일 인수가 아닌 두개의 인수로 인식해서 파일을 출력할 수 없는 오류 메시지를 확인할 수 있습니다.
~]# ls -l 05-06 access_log.txt
ls: cannot access 05-06: No such file or directory
ls: cannot access access_log.txt: No such file or directory
이제 쌍따옴표(Double Quotes)를 사용했을 때 나오는 내용입니다.
~]# ls -l "05-06 access_log.txt"
-rw-rw-r-- 1 root root 18 2029-07-20 17:13 05-06 access_log.txt
더블 쿼츠는 텍스트에서 공백이 있더라도 유닉스 시스템에서는 한 칸으로 인식하며 텍스트의 일부로 인식하지 않습니다.
~]# echo Show Me The Money
Show Me The Money
## 텍스트의 일부로 인식시키기 위해 쌍따옴표 사용하기
~]# echo "Show Me The Money"
Show Me The Money
##
~]# echo $(cal)
February 2024 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
~]# echo "$(cal)"
February 2024
Su Mo Tu We Th Fr Sa
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29
2.2 싱글 쿼츠(Single Quotes)
싱글 쿼츠(Single Quotes)는 모든 확장을 제한한 때 사용합니다. 더블 쿼츠에서 제한할 수 없던 $ 옵션을 제한할 수 이쓴 것을 확인할 수 있습니다.
~]# echo Show Me The Money '$100'
Show Me The Money $100
2.3 이스케이프 문자(Escape Character) 백슬러쉬
‘$’ 문자를 출력하기 위해 이스케이프 문자인 백슬래시(\)를 넣어서 출력할 수 있습니다. 더블 퀴츠에서도 이스케이브 문자인 백슬러시를 적용해서 $를 출력할 수 있습니다. 백슬래시(\)는 쌍 따옴표 안에서 자주 사용됩니다.
~]# echo Show Me The Money \$100
Show Me The Money $100
~]# echo Show Me The Money "\$100"
Show Me The Money $100
2.3 Shell 인용과 이스케이프 문자 정리표
차후 더 많은 확장과 인용을 사용하게 되기 때문에 가장 기본적인 Shell 확장과 인용에 대해 정리 해 봤습니다.