System/Shell Script

[쉘 스크립트] $는 어떤 용도로 쓰일까?

Yoonsoo Park 2024. 11. 16. 14:41

**해당 포스트는 Ubunto 22.04와 xShell을 기반으로 진행한 포스팅입니다. 

 

 이번 포스팅에서는 쉘 스크립트에서 자주 사용하는 $의 용도에 대해 알아보자. $이 굉장히 자주 쓰이기 때문에 한번 정리하면 좋을 거 같아서 이번 포스팅을 작성하게 됐다. 

 

 주로 사용되는 $의 용도는 다음과 같다. 

용도 예시
변수 참조 $변수명, $USER
특수 변수 $1, $2, $0, $@, $?, $$, $#
명령어 치환 $(command)
변수 확장 ${var), $(var:-default}
배열, 리스트 참조 ${list[0]}, ${list[@]}
리터럴 $ \$

 

선언된 지역 변수와 환경 변수를 $를 이용해 참조하는 것은 이미 어느 정도 익숙할테니, 다른 용도들에 대해서만 이번 포스팅에서 다뤄보겠다. 변수 선언 또는 참조가 궁금하다면 아래의 포스팅을 참고해 보자!

 

[쉘 스크립트] 변수, Quoating, Redirection, Pipeline

**해당 포스트는 Ubunto 22.04와 xShell을 기반으로 진행한 포스팅입니다.  1. 로컬 변수와 환경 변수 설정 로컬 변수(Local Variable) - 소문자로 표기: 현재 셸 세션에서만 사용되는 변수로, 새로 셸을

qkrdbstn303.tistory.com

 

1) 특수 변수

  • 쉘에서 미리 정의된 변수로, 스크립트 실행 상태나 명령어의 정보를 제공
  • 종류
    • $1, $2.. : 첫 번째, 두 번째 인자를 받아오는 매개변수
    • $@ : 모든 인수를 별도의 문자열로 처리하여 받아오는 매개 변수 
    • $0 : 스크립트에서 사용할 경우, 현재 스크립트의 이름을 반환, 명령어로 사용할 경우 현재 쉘의 이름을 출력
    • $? : 마지막으로 실행한 명령어의 종료 상태 (0: 성공, 1 이상: 실패)
    • $# : 스크립트에 전달된 인수의 개수
    • $$ : 현재 실행 중인 프로세스 ID (PID)

예제) 두 수를 입력받아 크기를 비교하는 스크립트를 작성하라(명령줄 인수를 사용하라). 

**명령줄 인수: 스크립트 실행을 위한 명령어와 함께 인수를 입력받는 것 

#!/bin/bash


if [ $1 -gt $2 ]; then 
	echo "$1이 $2보다 큽니다"
elif [ $1 -lt $2 ]; then
	echo "$2가 $1보다 큽니다"
else
	echo "같은 수 입니다"
fi

echo "입력된 수는 $@"
echo "현재 스크립트의 이름은: $0"
echo "받은 인수의 갯수는 $#"
echo "PID: $$"
echo $?
root@root:~/testdir# sh param_test.sh 10 20
20가 10보다 큽니다
입력된 수는 10 20
현재 스크립트의 이름은: param_test.sh
받은 인수의 갯수는 2
PID: 66684
0

 

 

2) 명령어 치환

  • 명령어의 실행 결과를 변수 또는 다른 명령어로 전달하는 기능

예제) 오늘 날짜를 내용으로 갖는 [오늘 날짜].log 라는 파일을 만들어주는 스크립트를 작성하라

#!/bin/bash

today=$(date +%y-%m-%d) 
// date: 현재 날짜를 보여주는 명령어
// date 명령어의 실행 결과를 today 변수에 대입한다.

echo "$today"  > $today.log
root@root:~/testdir# cat 24-11-16.log 
24-11-16

 

 

3) 변수 확장 

  • 변수의 값을 동적으로 참조하거나, 조작할 때 사용
  • 종류
    • 기본 변수 확장: echo "Hello, ${name}!" (= 변수 참조) **중괄호는 변수명을 명확하게 분리하기 위해서
    • 기본값 설정
      • var가 설정되지 않았거나 비어 있으면 "기본값" 출력
      • echo ${var:-"기본값"}
    • 기본값 설정 및 할당
      • var가 설정되지 않았거나 비어 있으면 "기본값"을 var에 할당하고 출력
      • echo ${var:="기본값"}
    • 변수 설정 여부 확인
      • var가 설정되어 있으면 "설정됨" 출력
      • echo ${var:+"설정됨"}
    • 변수 미설정 시 오류 출력
      • var가 설정되지 않았거나 비어 있으면 오류 메시지 출력 후 종료
      • echo ${var:?"오류: 변수가 설정되지 않았습니다."}
    • 문자열 길이 
      • echo ${#str}

예제) 이름을 입력받고, 이름이 없을 경우 'Guest'로 기본값을 설정한 후, 입력된 이름의 길이를 출력하는 스크립트를 작성하라

#!/bin/bash

name=${1:-"Guest"}
length=${#name}

echo "입력된 사용자의 이름은: $name"
echo "이름의 길이는 ${length}자 입니다"
root@root:~/testdir# sh who.sh chulsoo
입력된 사용자의 이름은: chulsoo
이름의 길이는 7자 입니다

 

 

4) 배열, 리스트 참조

  • 리스트 선언 : list=(value1 value2 value3)
  • 리스트 요소 참조 
    • ${array[0]} : 첫 번째 요소 참조
    • ${array[1]} : 두 번째 요소 참조 
    • ${array[@]} : 리스트의 모든 요소 참조
  • 리스트 길이
    • ${#array[@]} : 변수 확장(#)을 이용하여 리스트의 길이를 참조

예제) 현재 디렉토리 내의 모든 파일을 오름차순으로 정렬하여 리스트 형식으로 만들고, 이름에서 확장자를 제거하여 출력하는 스크립트를 작성하라. 

#!/bin/bash

# 현재 디렉토리의 파일 리스트를 정렬하여 리스트로 저장
list=($(ls | sort))

for file in "${list[@]}"; do // 리스트의 모든 요소를 순회
    # 확장자 제거
    base_name=${file%.*}
    echo "$base_name" 
done
root@root:~/testdir# ./list_test.sh 
$var1
24-11-14-03:39:46
24-11-16
all_dir
date_test
file2
for_test1
for_test
gettext
list
list_test
..

 

 

 

 힘들지만 오늘도 해낸 나를 위한 한 마디,

"많은 사람이 단 한 번 도약할 용기를 내지 못하고, 망설이면서 오랜 시간을 낭비한다", 도 잔타마타

 

"순간의 망설임은 시간이 지날수록 더 깊은 두려움이 된다. 망설임을 느끼고 있는 순간에 내게 주어진 기회를 놓치지 않고 행동할 수 있는 용기를 가지자"