소개
이 실습에서는 쉘 스크립트의 기본적인 문자열 연산에 대해 배웁니다. 문자열 연산은 다양한 스크립팅 작업에서 텍스트 데이터를 조작하고 추출하는 데 필수적입니다. 문자열 길이 확인, 특정 문자의 위치 찾기, 부분 문자열 추출, 그리고 문자열의 일부를 치환하는 개념을 살펴보게 됩니다. 이러한 기술은 효율적인 쉘 스크립트 기반 텍스트 처리를 위해 매우 중요합니다.
빠른 참조 가이드
이번 실습에서 다룰 문자열 연산의 요약 정보입니다:
| 연산 | 구문 | 설명 | 예시 |
|---|---|---|---|
| 문자열 길이 | ${#string} |
문자열의 전체 문자 수를 계산합니다. | ${#"hello"} 결과: 5 |
| 문자 위치 찾기 | $(expr index "$string" "$char") |
문자열에서 특정 문자의 위치를 찾습니다 (1 부터 시작) | $(expr index "abcdef" "c") 결과: 3 |
| 부분 문자열 추출 | ${string:start:length} |
문자열의 일부를 추출합니다 (0 부터 시작) | ${"hello":1:3} 결과: ell |
| 첫 번째 일치 항목 치환 | ${string/pattern/replacement} |
패턴과 처음 일치하는 부분을 치환합니다. | ${"hello"/l/L} 결과: heLlo |
| 모든 일치 항목 치환 | ${string//pattern/replacement} |
패턴과 일치하는 모든 부분을 치환합니다. | ${"hello"//l/L} 결과: heLLo |
| 시작 부분 치환 | ${string/#pattern/replacement} |
문자열 시작 부분이 패턴과 일치할 때만 치환합니다. | ${"hello"/#he/HE} 결과: HEllo |
| 끝 부분 치환 | ${string/%pattern/replacement} |
문자열 끝 부분이 패턴과 일치할 때만 치환합니다. | ${"hello"/%lo/LO} 결과: helLO |
스크립트 파일 생성하기
먼저 문자열 연산을 작성할 스크립트 파일을 만드는 것부터 시작해 보겠습니다.
WebIDE 에서 터미널을 엽니다. 터미널은 리눅스 시스템과 상호작용하기 위해 명령어를 입력하는 곳입니다.
프로젝트 디렉토리로 이동합니다:
cd ~/project이 명령어는 현재 작업 디렉토리를
~/project로 변경합니다.~기호는 홈 디렉토리를 의미하므로,~/project는 홈 디렉토리 안에 있는 "project" 폴더를 뜻합니다.string_operations.sh라는 이름의 새 파일을 생성합니다:touch string_operations.shtouch명령어는 비어 있는 새 파일을 생성합니다. 만약 파일이 이미 존재한다면 파일의 타임스탬프를 업데이트합니다.WebIDE 에디터에서 파일을 엽니다. WebIDE 왼쪽의 파일 탐색기에서 파일 이름을 클릭하여 열 수 있습니다.
파일의 맨 윗줄에 인터프리터를 지정하는 셔뱅 (shebang) 라인을 추가합니다:
#!/bin/bash"셔뱅"이라고 불리는 이 라인은 시스템이 이 스크립트를 해석할 때 Bash 쉘을 사용하도록 지시합니다. 항상 쉘 스크립트의 첫 번째 줄에 위치해야 합니다.
문자열 길이
이제 문자열의 길이를 확인하는 방법을 배워보겠습니다.
string_operations.sh파일에 다음 코드를 추가하세요:echo "Step 2: String Length" STRING="Hello, World!" LENGTH=${#STRING} echo "The string is: $STRING" echo "Its length is: $LENGTH"코드를 단계별로 살펴보겠습니다:
먼저, 이 섹션의 제목을 표시하기 위해 echo 명령어를 추가했습니다.
echo "Step 2: String Length"다음으로,
STRING이라는 변수를 정의하고 "Hello, World!"라는 값을 할당했습니다.STRING="Hello, World!"Bash 에서는 변수를 정의할 때 특별한 키워드가 필요하지 않습니다. 변수 이름 뒤에 등호 (=) 를 붙이고 값을 쓰면 됩니다.
그 다음,
${#variable}구문을 사용하여 문자열의 길이를 계산하고LENGTH변수에 저장했습니다.LENGTH=${#STRING}${#variable}은 변수에 저장된 문자열의 문자 수를 반환하는 특별한 쉘 매개변수 확장 방식입니다.마지막으로, 원본 문자열과 그 길이를 화면에 출력합니다.
echo "The string is: $STRING" echo "Its length is: $LENGTH"변수 이름 앞에 붙는
$기호는 Bash 에게 해당 변수를 그 값으로 치환하라는 의미입니다.
파일을 저장합니다. 대부분의 에디터에서 Ctrl+S (Mac 은 Cmd+S) 를 눌러 저장할 수 있습니다.
스크립트에 실행 권한을 부여합니다:
chmod +x string_operations.sh이 명령어는 파일의 권한을 변경하여 실행 가능하게 만듭니다:
chmod는 "change mode"의 약자입니다.+x는 "실행 권한 추가"를 의미합니다.- 이 단계가 없으면 시스템은 이 파일을 프로그램으로 인식하지 못합니다.
스크립트를 실행합니다:
./string_operations.sh./접두사는 쉘에게 현재 디렉토리에서 스크립트를 찾으라고 알려줍니다. 이것이 없으면 쉘은 PATH 환경 변수에 등록된 디렉토리에서만 파일을 찾으려 할 것입니다.
다음과 같은 출력이 나타나야 합니다:
Step 2: String Length
The string is: Hello, World!
Its length is: 13
만약 결과가 나오지 않는다면, 파일을 저장했는지와 실행 권한을 부여했는지 다시 확인해 보세요.
문자 위치 찾기
다음으로, 문자열 내에서 특정 문자의 위치를 찾는 방법을 알아보겠습니다.
string_operations.sh파일에 다음 코드를 추가하세요:echo -e "\nStep 3: Finding Character Position" STRING="abcdefghijklmnopqrstuvwxyz" CHAR="j" POSITION=$(expr index "$STRING" "$CHAR") echo "The string is: $STRING" echo "We're looking for the character: $CHAR" echo "It is at position: $POSITION"이 코드를 자세히 살펴보겠습니다:
-e옵션과\n이스케이프 시퀀스가 포함된 echo 명령어로 시작합니다.echo -e "\nStep 3: Finding Character Position"-e옵션은 이스케이프 시퀀스 해석을 활성화합니다.\n은 텍스트 앞에 줄바꿈을 추가하여 이전 섹션과 시각적으로 구분해 줍니다.
다음으로 두 개의 변수를 정의합니다:
STRING="abcdefghijklmnopqrstuvwxyz" CHAR="j"STRING은 알파벳 소문자 전체를 담고 있습니다.CHAR는 우리가 찾고자 하는 문자 "j"를 담고 있습니다.
expr index명령어를 사용하여 문자의 위치를 찾습니다:POSITION=$(expr index "$STRING" "$CHAR")expr은 표현식을 평가하는 유틸리티입니다.index연산은 문자열에서 특정 문자를 검색합니다.$()구문은 명령어의 실행 결과를 캡처하여POSITION변수에 할당합니다.- 특수 문자 문제를 방지하기 위해 변수를 큰따옴표 (
"$STRING") 로 감쌌습니다. - 중요: 이 명령어는 위치를 1 부터 계산하여 반환합니다 (0 이 아님).
마지막으로 결과를 출력합니다:
echo "The string is: $STRING" echo "We're looking for the character: $CHAR" echo "It is at position: $POSITION"
파일을 저장하고 스크립트를 다시 실행합니다:
./string_operations.sh
다음과 같은 추가 출력이 나타나야 합니다:
Step 3: Finding Character Position
The string is: abcdefghijklmnopqrstuvwxyz
We're looking for the character: j
It is at position: 10
위치가 1 부터 시작하는 인덱스 (1-indexed) 임을 유의하세요. 즉, 첫 번째 문자의 위치는 0 이 아니라 1 입니다. 이는 인덱스가 보통 0 부터 시작하는 많은 프로그래밍 언어와는 다른 점입니다.
부분 문자열 추출
이제 문자열의 일부분을 추출하는 방법을 배워보겠습니다.
string_operations.sh파일에 다음 코드를 추가하세요:echo -e "\nStep 4: Substring Extraction" STRING="The quick brown fox jumps over the lazy dog" START=10 LENGTH=5 SUBSTRING=${STRING:$START:$LENGTH} echo "The original string is: $STRING" echo "Extracting 5 characters starting from position 10:" echo "The substring is: $SUBSTRING"코드를 하나씩 분석해 보겠습니다:
시각적 구분을 위해 줄바꿈이 포함된 헤더를 추가합니다:
echo -e "\nStep 4: Substring Extraction"변수를 정의합니다:
STRING="The quick brown fox jumps over the lazy dog" START=10 LENGTH=5STRING은 예시 문장을 담고 있습니다.START는 추출을 시작할 위치입니다 (10 번 위치).LENGTH는 추출할 문자의 개수입니다 (5 개 문자).
Bash 의 부분 문자열 추출 구문을 사용하여 문자열의 일부를 가져옵니다:
SUBSTRING=${STRING:$START:$LENGTH}- 구문 형식은
${variable:시작_위치:길이}입니다. $START와$LENGTH는 각각 10 과 5 라는 값을 가진 변수입니다.- 중요:
expr index명령어와 달리, 여기서의 위치는 0 부터 시작하는 인덱스 (0-indexed) 입니다. 즉, 첫 번째 문자의 위치는 0 입니다.
- 구문 형식은
결과를 출력합니다:
echo "The original string is: $STRING" echo "Extracting 5 characters starting from position 10:" echo "The substring is: $SUBSTRING"
파일을 저장하고 스크립트를 다시 실행합니다:
./string_operations.sh
다음과 같은 추가 출력이 나타나야 합니다:
Step 4: Substring Extraction
The original string is: The quick brown fox jumps over the lazy dog
Extracting 5 characters starting from position 10:
The substring is: brown
"The quick brown fox..."라는 문자열에서 (0 부터 셌을 때) 10 번 위치는 "brown"의 'b'이며, 그 뒤로 5 개의 문자는 "brown"입니다. 이것이 추출된 결과가 "brown"인 이유입니다.
이전 단계와 인덱스 방식이 다르다는 점을 꼭 기억하세요:
expr index(3 단계) 에서는 위치가 1 부터 시작합니다 (첫 문자가 1 번).- 부분 문자열 추출
${STRING:position:length}(4 단계) 에서는 위치가 0 부터 시작합니다 (첫 문자가 0 번).
이는 쉘 스크립트에서 자주 혼동되는 부분이므로, 어떤 연산이 어떤 인덱스 체계를 사용하는지 기억하는 것이 중요합니다.
문자열 치환
마지막으로, 문자열의 일부를 다른 내용으로 바꾸는 방법을 배워보겠습니다.
string_operations.sh파일에 다음 코드를 추가하세요:echo -e "\nStep 5: String Replacement" STRING="The quick brown fox jumps over the lazy dog" echo "Original string: $STRING" ## Replace the first occurrence of 'o' with 'O' NEW_STRING=${STRING/o/O} echo "Replacing first 'o' with 'O': $NEW_STRING" ## Replace all occurrences of 'o' with 'O' NEW_STRING=${STRING//o/O} echo "Replacing all 'o' with 'O': $NEW_STRING" ## Replace 'The quick' with 'The slow' if it's at the beginning of the string NEW_STRING=${STRING/#The quick/The slow} echo "Replacing 'The quick' with 'The slow' at the beginning: $NEW_STRING" ## Replace 'dog' with 'cat' if it's at the end of the string NEW_STRING=${STRING/%dog/cat} echo "Replacing 'dog' with 'cat' at the end: $NEW_STRING"각 문자열 치환 연산을 살펴보겠습니다:
헤더를 출력하고 원본 문자열을 보여줍니다:
echo -e "\nStep 5: String Replacement" STRING="The quick brown fox jumps over the lazy dog" echo "Original string: $STRING"문자의 첫 번째 일치 항목 치환:
## Replace the first occurrence of 'o' with 'O' NEW_STRING=${STRING/o/O} echo "Replacing first 'o' with 'O': $NEW_STRING"- 구문 형식은
${variable/pattern/replacement}입니다. - 처음으로 발견되는 'o'를 찾아 'O'로 바꿉니다.
- "brown"에 있는 첫 번째 'o'만 바뀌고 나머지는 그대로 유지됩니다.
- 구문 형식은
모든 일치 항목 치환:
## Replace all occurrences of 'o' with 'O' NEW_STRING=${STRING//o/O} echo "Replacing all 'o' with 'O': $NEW_STRING"- 구문 형식은
${variable//pattern/replacement}입니다 (슬래시가 두 개임에 유의). - 이중 슬래시는 Bash 에게 패턴과 일치하는 모든 항목을 바꾸라고 지시합니다.
- 문자열 전체에 있는 모든 'o'가 'O'로 바뀝니다.
- 구문 형식은
문자열 시작 부분의 패턴 치환:
## Replace 'The quick' with 'The slow' if it's at the beginning of the string NEW_STRING=${STRING/#The quick/The slow} echo "Replacing 'The quick' with 'The slow' at the beginning: $NEW_STRING"- 구문 형식은
${variable/#pattern/replacement}입니다. #기호는 패턴이 반드시 문자열의 시작 부분에 있어야 함을 지정합니다.- 'The quick'이 문자열 맨 앞에 있을 때만 치환이 일어납니다.
- 구문 형식은
문자열 끝 부분의 패턴 치환:
## Replace 'dog' with 'cat' if it's at the end of the string NEW_STRING=${STRING/%dog/cat} echo "Replacing 'dog' with 'cat' at the end: $NEW_STRING"- 구문 형식은
${variable/%pattern/replacement}입니다. %기호는 패턴이 반드시 문자열의 끝 부분에 있어야 함을 지정합니다.- 'dog'가 문자열 맨 마지막에 있을 때만 치환이 일어납니다.
- 구문 형식은
파일을 저장하고 스크립트를 다시 실행합니다:
./string_operations.sh
다음과 같은 추가 출력이 나타나야 합니다:
Step 5: String Replacement
Original string: The quick brown fox jumps over the lazy dog
Replacing first 'o' with 'O': The quick brOwn fox jumps over the lazy dog
Replacing all 'o' with 'O': The quick brOwn fOx jumps Over the lazy dOg
Replacing 'The quick' with 'The slow' at the beginning: The slow brown fox jumps over the lazy dog
Replacing 'dog' with 'cat' at the end: The quick brown fox jumps over the lazy cat
이러한 문자열 치환 연산은 쉘 스크립트에서 텍스트를 조작하는 강력한 도구입니다. 패턴과 위치를 기반으로 정밀한 치환이 가능하여 데이터 처리, 텍스트 포맷팅, 파일 내용 수정 등의 작업에 매우 유용합니다.
요약
이 실습을 통해 쉘 스크립트의 여러 가지 핵심적인 문자열 연산을 배우고 실습했습니다:
- 쉘 스크립트 생성 및 실행 방법.
${#string}을 사용한 문자열 길이 계산.$(expr index "$string" "$char")를 사용한 문자 위치 찾기.${string:start:length}를 사용한 부분 문자열 추출.- 다음과 같은 다양한 문자열 치환 연산 수행:
${string/pattern/replacement}- 첫 번째 일치 항목 치환${string//pattern/replacement}- 모든 일치 항목 치환${string/#pattern/replacement}- 문자열 시작 부분 치환${string/%pattern/replacement}- 문자열 끝 부분 치환
이러한 기술은 쉘 스크립트에서 더 복잡한 텍스트 처리 작업을 수행하기 위한 기초가 됩니다. 앞으로 쉘 스크립트를 작성할 때, 이러한 문자열 연산들이 프로젝트의 텍스트 데이터를 조작하고 분석하는 데 매우 유용하다는 것을 알게 될 것입니다. 숙달을 위해서는 연습이 가장 중요하므로, 다양한 문자열과 연산을 직접 시도해 보세요!



