RECENT POSTS

최근에 작성한 글

01 / 03

전체 글

전체 보기

[Linux] Bash: 확장

1. 확장

확장 : 셸이 명령을 해석하고 실행하기 전에 명령에 포함된 문자열, 수, 와일드카드 패턴 등을 변환하는 과정

1. 중괄호 확장

중괄호 확장 : 중괄호를 사용해 문자열 시퀀스나 조합을 생성하는 것

✅ 중괄호 안에 쉼표로 구분한 문자열 입력 → 왼쪽에서 오른쪽으로 순서대로 문자열을 한번씩 사용하여 새로운 문자열 만듦 ( 쉼표 뒤 공백 X)

echo hello-{cat, dog, world}
#hello-cat hello-dog hello-word

✅ 공백을 포함해 중괄호 확장 → 공백 앞 \\

echo hello-{cat, happy\\ dog, world}
#hello-cat hello-happy dog hello-world

✅ 싱글 쿼트나 더블 쿼트 사용하면 안됨 → 쿼팅된 중괄호는 확장되지 않고 문자 그대로 해석

echo "hello-{cat, dog, world}"
#hello-{cat, dog, world}

☑️ 중괄호 확장 중첩은 가능

echo hello-{cat, {happy,wild}-dog, world}
#hello-cat hello-happy-dog hello-wild-dog hello-world

☑️ {시작..끝} 또는 {시작..끝..증분} 형식도 지원

2. 틸데 확장

틸데 확장 : ~ 가 홈 디렉터리로 변환되는 것

✅ ~ 뒤에 아무것도 없으면 사용자의 홈 디렉터리로 확장

✅ ~ 를 쿼팅하면 문자 그대로 해석

✅ ~ + 사용자 이름 → 해당 사용자의 홈 디렉터리로 확장

✅ ~+ : 현재 작업 디렉토리로 확장

✅ ~- : 이전 디렉터리로 확장

3. 명령어 치환

명령어 치환 : $() 로 둘러싸인 명령어를 실행하고 그 결과를 현재 셸의 명령어나 스크립트에서 사용할 수 있게 함

remember_datetime = $(date + "%Y-%m-%d %H:%M:%S")
echo $remember_datetime
#2025-03-12 10:09:27

4. 산술 확장

산술 확장 : $(()) 나 이중괄호로 감싼 표현식을 산술로 연산해 그 결과를 스크립트에서 사용

result = $((3+2))
echo $result
#5

((result = result - 4 ))
#1

 

🚀 정수형 변수의 산술 연산
일반 변수는 지정된 값을 문자열로 해석하기 때문에 산술 연산이 적용되지 않음
→ 산술 확장이나 let 명령어를 사용
✅ declare -i 로 선언한 변수는 정수형 변수 취금 → 정수가 아닌 값은 무조건 0이 저장
✅ 정수형 변수로 산술 연산한 결과를 정수형 변수가 아닌 일반 변수에 저장하면 산술 연산이 적용되지 않음
✅ 일반 변수 ⇒ 정수 값이 저장 & 연산 결과 ⇒ 정수형 변수에 저장 : 산술 연산이 적용
🚀 산술 연산자
✅ ** : 지수 연산자 ** 앞은 밑 ** 뒤는 지수
✅ % : 나눗셈을 한 나머지를 반환하는 나머지 연산자
🚀 비교 연산자
✅ > : 왼쪽의 값이 크다
✅ >= : 왼쪽의 값이 크거나 같다
✅ < : 왼쪽 값이 작다
✅ <= : 왼쪽의 값이 작거나 같다
✅ == : 두 값이 같다
✅ != : 두 값이 같지 않다
🚀 논리 연산자
✅ && : 논리 곱 연산자, 두 조건이 모두 침인 경우에만 결과가 참
✅ || : 논리합 연산자, 두 조건 중 하나만 참이면 결과가 참
✅ ! : 논리 부정 연산자, 결과를 반대로 뒤집음
🚀 비트 연산자
✅ | : 두 값 중 하나라도 1이면 1
✅ & : 두 값 모두 1이어야 1
✅ ^ : 두 값이 같으면 0, 다르면 1
✅ ~ : 0은 1로 1은 0으로 바뀜
✅ <<n : 왼쪽으로 n 비트 움직이고 새로운 값의 하위 부분은 1으로 채워줌
✅ >>n : 오른쪽으로 n 비트 움직이고 값의 하위 n 비트는 제거
🚀 할당 연산자
변수에 값을 저장하는 연산자

5. 서브스트링 확장

서브스트링 확장 : 변수에 저장된 문자열의 특정 부분을 추출하는 기능

${변수:오프셋}
${변수:오프셋:길이}

✅ 변수에 저장된 문자열의 오프셋부터 길이만큼의 문자열을 추출

✅ 오프셋 : 추출할 문자열의 시작 위치, 음수라면 뒤에서 부터 추출

✅ 길이 : 추출할 문자열의 길이, 생략된 형태라면 문자열 끝까지 추출

#인덱스 배열도 문자열과 비슷하 형식으로 사용가능
${변수[@] : 오프셋}
${변수[@] : 오프셋 : 길이}

6. 패턴 찾아 바꾸기

변수에 저장된 문자열에서 패턴과 일치하는 문자나 문자열을 찾으면 다른 값으로 바꾸는 기능

1️⃣ 패턴과 첫번쨰로 일치하는 문자나 문자열을 찾으면 지정한 문자열로 변경

${변수/패턴/문자열}

2️⃣ 패턴과 일치하는 모든 문자나 문자열을 지정한 문자열로 변경

${변수//패턴/문자열}

3️⃣ 일치하는 부분이 문자열의 시작일 때만 변경

${변수/#패턴/문자열}

4️⃣ 일치하는 부분이 문자열의 끝일 때만 변경

${변수/%패턴/문자열}

7. 대소문자 바꾸기

변수에 저장된 첫 번째 문자 또는 문자열 전체에서 패턴과 일치하는 문자가 있으면 대문자 또는 소문자로 바꾸는 기능

✅ 패턴에는 한 글자만

✅ 패턴을 입력하지 않으면 모든 문자가 매치되는 것으로 간주 → 문자열 전체가 변경

1️⃣ 패턴과 일치하는 문자를 모두 대문자

${변수^^패턴}

2️⃣ 첫 번째 문자가 패턴과 일치하면 첫 번째 문자를 대문자로

${변수^패턴}

3️⃣ 패턴과 일치하는 문자를 모두 소문자로

${변수,,패턴}

4️⃣ 첫 번째 문자가 패턴과 일치하면 첫 번째 문자를 소문자로

${변수,패턴}

8. 변수 값에 따른 확장

🚀 빈 값일 때 지정한 값 사용하기

변수에 값이 설정되지 않았거나 빈 값일 때 지정한 문자열 사용

${변수:-문자열}

🚀 빈 값일 때 지정한 값 사용하고 저장하기

변수에 값이 지정되지 않았을 때 지정된 문자열을 사용하고 변수에 저장

${변수:=문자열}

🚀 빈 값일 때 에러 발생시키기

변수에 값이 설정되지 않았거나 빈 값일 때 에러 발생

${변수:?문자열}

🚀 빈 값이 아닐 때 지정한 값 사용하기

지정된 값 대신 지정한 값을 사용

변수에 지정된 값은 바뀌지 않음

변수에 지정된 값이 없다면 지정한 값을 사용하지 않음

${변수:+문자열}

9. 간접 확장

간접 확장 : 변수의 이름을 저장하는 다른 변수를 통해 해당 변수의 값을 참조하는 기능 → 변수의 이름이나 값을 동적으로 처리할 수 있어 스크립트의 유연성과 재사용성이 향상

${!변수}
var = "this is real variable"
echo $var
#this is real variable

ref_var = "var"
echo ${ref_var}
#var

echo ${!ref_var}
#this is real variable

10. 일치하는 패턴 제거

지정한 패턴과 일치하는 문자열을 제거한 후 값을 반환

1️⃣ 앞에서부터 패턴을 검색해 가장 짧게 일치하는 문자열 제거

${변수#패턴}

2️⃣ 앞에서부터 패턴을 검색해 가장 길게 일치하는 문자열 제거

${변수##패턴}

3️⃣ 뒤에서부터 패턴을 검색해 가장 짧게 일치하는 문자열 제거

${변수%패턴}

4️⃣ 뒤에서부터 패턴을 검색해 가장 길게 일치하는 문자열 제거

${변수%%패턴}

☑️ 패턴이 반드시 문자열의 앞 또는 뒤에서부터 일치해야 한다는 점 → 모든 문자를 의미하는 * 패턴을 사용하면 좋음

11. 확장 연산자

${변수@연산자}

✅ U : 모든 문자를 대문자로

✅ u : 첫 번째 문자만 대문자

✅ L : 모든 문자를 소문자로