Unix / Linux - 셸 인용 메커니즘

안녕하세요, 미래의 프로그래머 여러분! 오늘 우리는 Unix와 Linux의 흥미로운 셸 인용 메커니즘의 세상으로 뛰어들어 볼 거예요. 여러분의 친절한 이웃 컴퓨터 교사로서, 저는 이 여정을 단계별로 안내해 드리겠습니다. 걱정 마세요, 이전에 프로그래밍을 해본 적이 없어도 괜찮아요 - 우리는 기본부터 시작하여 차례대로 올라갈 거예요. 그러니 커피(또는 차, 당신이 좋아하는 것이라면)를 한 잔 챙겨서, 시작해 보세요!

Unix / Linux - Quoting Mechanisms

메타 문자

인용을 시작하기 전에 메타 문자에 대해 이해해야 해요. 셸에서 메타 문자는 특별한 의미를 가진 특수 문자들입니다. 이들은 당신의 좋아하는 요리의 향신료처럼 - 조금만 쓰더라도 길이가 됩니다!

다음은 일반적인 메타 문자의 표입니다:

메타 문자 의미
* 와일드카드 (모든 문자 수를 일치)
? 와일드카드 (모든 단일 문자를 일치)
> 출력 이동
< 입력 이동
& 백그라운드에서 명령 실행
; 명령 구분자
() 명령 그룹
[] 문자 클래스

예제를 보겠습니다:

ls *.txt

이 명령어에서 *는 메타 문자입니다. 이는 셸에게 .txt로 끝나는 모든 파일을 목록에 보이게 합니다. 꽤 멋진 거죠?

하지만 이 문자들을 일반 문자로 사용하고 싶다면 어떻게 해야 하나요? 그때 인용이 등장합니다!

단일 인용

단일 인용은 가장 간단한 인용 형식입니다. 이는 셸이 인용 안에 있는 모든 것을 리터럴 문자로 처리하도록 합니다. 마치 당신의 말을 보호하는 거대한 거품처럼!

예제를 시도해 보겠습니다:

echo 'The * is a wildcard character'

출력:

The * is a wildcard character

보세요? *는 모든 파일을 목록에 보이게 하지 않았습니다. 이는 일반 문자로 처리되었습니다.

단일 인용은 문자열 내에서 각 문자의 리터럴 값을 보존하고 싶을 때 유용합니다. 심지어 다른 인용 문자도 단일 인용 내에서 특별한 의미를 잃어버립니다!

echo 'This is a $VARIABLE with "double quotes" inside'

출력:

This is a $VARIABLE with "double quotes" inside

단일 인용 내에 있는 모든 것이 정확하게 출력됩니다. 치환 없이, 해석 없이, 순수한 텍스트!

이중 인용

이중 인용은 단일 인용의 친척보다 조금 더 유연합니다. 이는 대부분의 문자의 리터럴 값을 보존하지만, 일부 치환을 허용합니다. 마치 텍스트의 반투명 막처럼!

다음은 이중 인용이 허용하는 것들입니다:

  1. 변수 치환
  2. 명령 치환
  3. 백슬래시 이스케이프

예제를 보겠습니다:

NAME="Alice"
echo "Hello, $NAME!"

출력:

Hello, Alice!

변수 $NAME이 그 값으로 치환되었습니다. 마법!

이제 명령 치환을 시도해 보겠습니다:

echo "Today's date is $(date)"

출력:

Today's date is Tue May 23 10:30:45 PDT 2023

$(date) 부분은 date 명령의 출력으로 치환되었습니다. 멋지죠?

하지만 이중 인용 내에서 일부 문자는 여전히 특별한 의미를 가지고 있습니다:

echo "This is a newline: \n And this is a tab: \t"

출력:

This is a newline:
And this is a tab:

\n\t은 각각 줄 바꿈과 탭으로 해석됩니다.

백 tick

백 tick, 또는 백틱은 명령 치환의 더 오래된 형태입니다. 이는 Unix의 초기 시절로부터 시간 여행자처럼 보입니다!

이렇게 작동합니다:

echo "The current directory contains `ls | wc -l` files"

출력:

The current directory contains 42 files

백 tick 사이의 명령(ls | wc -l)이 실행되고, 그 출력이 문자열로 치환됩니다.

백 tick이 여전히 작동하지만, 더 현대적인 $() 문법이 일반적으로 선호됩니다:

echo "The current directory contains $(ls | wc -l) files"

이는 같은 작업을 수행하지만, 중첩하기 쉽고, 제 개인적인 의견에 따르면 더 읽기 쉬워요. 마치 플립폰에서 스마트폰으로 업그레이드한 것처럼 - 기본 기능은 같지만, 훨씬 더 사용자 친화적입니다!

모든 것을 함께

이제 우리는 모든 인용 메커니즘을 탐구했으니, 이들을 재미있는 작은 스크립트로 결합해 보겠습니다:

#!/bin/bash

NAME="World"
GREETING='Hello'
DATE=$(date +"%A, %B %d, %Y")

echo "$GREETING, $NAME!"
echo 'Today is not actually $DATE'
echo "But for real, today is $DATE"
echo "There are `ls | wc -l` files in this directory"

이 스크립트를 실행하면 다음과 같은 출력을 받을 수 있습니다:

Hello, World!
Today is not actually $DATE
But for real, today is Tuesday, May 23, 2023
There are 42 files in this directory

각 인용 형식이 출력에 어떤 영향을 미치는지 볼 수 있나요? 단일 인용은 모든 것을 리터럴로 보존하며, 이중 인용은 치환을 허용하고, 백 tick(또는 $())은 명령 치환을 수행합니다.

그렇죠! 여러분은 셸 인용 메커니즘의 세상으로 첫 걸음을 뗐습니다. 연습이 완벽을 만든다는 것을 기억하세요, 그러니 이 개념들을 실험해 두려워 마세요. 얼마 지나지 않아 프로처럼 인용을 할 수 있을 거예요!

행복하게 코딩하세요, 셸이 여러분과 함께하길 바랍니다! ??

Credits: Image by storyset