**해당 포스트는 Ubunto 22.04와 xShell을 기반으로 진행한 포스팅입니다.
이번 포스팅에서는 쉘 스크립트에서 자주 사용하는 $의 용도에 대해 알아보자. $이 굉장히 자주 쓰이기 때문에 한번 정리하면 좋을 거 같아서 이번 포스팅을 작성하게 됐다.
주로 사용되는 $의 용도는 다음과 같다.
용도 | 예시 |
변수 참조 | $변수명, $USER |
특수 변수 | $1, $2, $0, $@, $?, $$, $# |
명령어 치환 | $(command) |
변수 확장 | ${var), $(var:-default} |
배열, 리스트 참조 | ${list[0]}, ${list[@]} |
리터럴 $ | \$ |
선언된 지역 변수와 환경 변수를 $를 이용해 참조하는 것은 이미 어느 정도 익숙할테니, 다른 용도들에 대해서만 이번 포스팅에서 다뤄보겠다. 변수 선언 또는 참조가 궁금하다면 아래의 포스팅을 참고해 보자!
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
..
힘들지만 오늘도 해낸 나를 위한 한 마디,
"많은 사람이 단 한 번 도약할 용기를 내지 못하고, 망설이면서 오랜 시간을 낭비한다", 도 잔타마타
"순간의 망설임은 시간이 지날수록 더 깊은 두려움이 된다. 망설임을 느끼고 있는 순간에 내게 주어진 기회를 놓치지 않고 행동할 수 있는 용기를 가지자"
'System > Shell Script' 카테고리의 다른 글
[쉘 스크립트] select, while, until (0) | 2024.11.18 |
---|---|
[쉘 스크립트] sed, if, read, case (1) | 2024.11.18 |
[쉘 스크립트] 변수, Quoating, Redirection, Pipeline (0) | 2024.11.15 |