기본 문자열 연산

ShellBeginner
지금 연습하기

소개

이 실습에서는 쉘 스크립트의 기본적인 문자열 연산에 대해 배웁니다. 문자열 연산은 다양한 스크립팅 작업에서 텍스트 데이터를 조작하고 추출하는 데 필수적입니다. 문자열 길이 확인, 특정 문자의 위치 찾기, 부분 문자열 추출, 그리고 문자열의 일부를 치환하는 개념을 살펴보게 됩니다. 이러한 기술은 효율적인 쉘 스크립트 기반 텍스트 처리를 위해 매우 중요합니다.

빠른 참조 가이드

이번 실습에서 다룰 문자열 연산의 요약 정보입니다:

연산 구문 설명 예시
문자열 길이 ${#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
이 과정은 단계별 안내를 통해 학습과 실습을 돕는 가이드형 실습입니다. 각 단계를 주의 깊게 따라가며 직접 경험을 쌓아보세요. 통계에 따르면 이 실습은 초급 수준이며, 97%의 수료율과 학습자들로부터 100%의 긍정적인 평가를 받았습니다.

스크립트 파일 생성하기

먼저 문자열 연산을 작성할 스크립트 파일을 만드는 것부터 시작해 보겠습니다.

  1. WebIDE 에서 터미널을 엽니다. 터미널은 리눅스 시스템과 상호작용하기 위해 명령어를 입력하는 곳입니다.

  2. 프로젝트 디렉토리로 이동합니다:

    cd ~/project

    이 명령어는 현재 작업 디렉토리를 ~/project로 변경합니다. ~ 기호는 홈 디렉토리를 의미하므로, ~/project는 홈 디렉토리 안에 있는 "project" 폴더를 뜻합니다.

  3. string_operations.sh라는 이름의 새 파일을 생성합니다:

    touch string_operations.sh

    touch 명령어는 비어 있는 새 파일을 생성합니다. 만약 파일이 이미 존재한다면 파일의 타임스탬프를 업데이트합니다.

  4. WebIDE 에디터에서 파일을 엽니다. WebIDE 왼쪽의 파일 탐색기에서 파일 이름을 클릭하여 열 수 있습니다.

  5. 파일의 맨 윗줄에 인터프리터를 지정하는 셔뱅 (shebang) 라인을 추가합니다:

    #!/bin/bash

    "셔뱅"이라고 불리는 이 라인은 시스템이 이 스크립트를 해석할 때 Bash 쉘을 사용하도록 지시합니다. 항상 쉘 스크립트의 첫 번째 줄에 위치해야 합니다.

문자열 길이

이제 문자열의 길이를 확인하는 방법을 배워보겠습니다.

  1. 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 에게 해당 변수를 그 값으로 치환하라는 의미입니다.

  2. 파일을 저장합니다. 대부분의 에디터에서 Ctrl+S (Mac 은 Cmd+S) 를 눌러 저장할 수 있습니다.

  3. 스크립트에 실행 권한을 부여합니다:

    chmod +x string_operations.sh

    이 명령어는 파일의 권한을 변경하여 실행 가능하게 만듭니다:

    • chmod는 "change mode"의 약자입니다.
    • +x는 "실행 권한 추가"를 의미합니다.
    • 이 단계가 없으면 시스템은 이 파일을 프로그램으로 인식하지 못합니다.
  4. 스크립트를 실행합니다:

    ./string_operations.sh

    ./ 접두사는 쉘에게 현재 디렉토리에서 스크립트를 찾으라고 알려줍니다. 이것이 없으면 쉘은 PATH 환경 변수에 등록된 디렉토리에서만 파일을 찾으려 할 것입니다.

다음과 같은 출력이 나타나야 합니다:

Step 2: String Length
The string is: Hello, World!
Its length is: 13

만약 결과가 나오지 않는다면, 파일을 저장했는지와 실행 권한을 부여했는지 다시 확인해 보세요.

문자 위치 찾기

다음으로, 문자열 내에서 특정 문자의 위치를 찾는 방법을 알아보겠습니다.

  1. 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"
  2. 파일을 저장하고 스크립트를 다시 실행합니다:

    ./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 부터 시작하는 많은 프로그래밍 언어와는 다른 점입니다.

부분 문자열 추출

이제 문자열의 일부분을 추출하는 방법을 배워보겠습니다.

  1. 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=5
      • STRING은 예시 문장을 담고 있습니다.
      • 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"
  2. 파일을 저장하고 스크립트를 다시 실행합니다:

    ./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 번).

이는 쉘 스크립트에서 자주 혼동되는 부분이므로, 어떤 연산이 어떤 인덱스 체계를 사용하는지 기억하는 것이 중요합니다.

문자열 치환

마지막으로, 문자열의 일부를 다른 내용으로 바꾸는 방법을 배워보겠습니다.

  1. 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'가 문자열 맨 마지막에 있을 때만 치환이 일어납니다.
  2. 파일을 저장하고 스크립트를 다시 실행합니다:

    ./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

이러한 문자열 치환 연산은 쉘 스크립트에서 텍스트를 조작하는 강력한 도구입니다. 패턴과 위치를 기반으로 정밀한 치환이 가능하여 데이터 처리, 텍스트 포맷팅, 파일 내용 수정 등의 작업에 매우 유용합니다.

요약

이 실습을 통해 쉘 스크립트의 여러 가지 핵심적인 문자열 연산을 배우고 실습했습니다:

  1. 쉘 스크립트 생성 및 실행 방법.
  2. ${#string}을 사용한 문자열 길이 계산.
  3. $(expr index "$string" "$char")를 사용한 문자 위치 찾기.
  4. ${string:start:length}를 사용한 부분 문자열 추출.
  5. 다음과 같은 다양한 문자열 치환 연산 수행:
    • ${string/pattern/replacement} - 첫 번째 일치 항목 치환
    • ${string//pattern/replacement} - 모든 일치 항목 치환
    • ${string/#pattern/replacement} - 문자열 시작 부분 치환
    • ${string/%pattern/replacement} - 문자열 끝 부분 치환

이러한 기술은 쉘 스크립트에서 더 복잡한 텍스트 처리 작업을 수행하기 위한 기초가 됩니다. 앞으로 쉘 스크립트를 작성할 때, 이러한 문자열 연산들이 프로젝트의 텍스트 데이터를 조작하고 분석하는 데 매우 유용하다는 것을 알게 될 것입니다. 숙달을 위해서는 연습이 가장 중요하므로, 다양한 문자열과 연산을 직접 시도해 보세요!