#!/bin/bash | Bash 셔뱅 (스크립트 첫 줄) |
#!/usr/bin/env bash | 이식성 있는 셔뱅 |
chmod +x script.sh | 스크립트 실행 가능하게 만들기 |
./script.sh | 현재 디렉토리에서 스크립트 실행 |
bash script.sh | bash로 스크립트 실행 |
source script.sh | 현재 쉘에서 스크립트 실행 |
. script.sh | source와 동일 (축약형) |
# comment | 한 줄 주석 |
set -x | 디버그 모드 활성화 (명령어 출력) |
set +x | 디버그 모드 비활성화 |
set -e | 에러 시 종료 |
set -u | 정의되지 않은 변수 시 에러 |
set -o pipefail | 파이프라인 중 하나라도 실패하면 실패 |
name="value" | 변수 할당 (= 주위 공백 없음) |
$name or ${name} | 변수 사용 |
readonly name="value" | 읽기 전용 변수 (상수) |
unset name | 변수 삭제 |
local name="value" | 지역 변수 (함수 내부) |
export name="value" | 환경 변수로 내보내기 |
declare -i num=5 | 정수 변수 선언 |
$0 | 스크립트 이름 |
$1, $2, ... | 위치 매개변수 (인수) |
$# | 인수 개수 |
$@ | 모든 인수 (개별 단어로) |
$* | 모든 인수 (단일 문자열로) |
$? | 마지막 명령어 종료 상태 |
$$ | 현재 프로세스 ID |
$! | 마지막 백그라운드 프로세스 PID |
${var:-default} | var가 없으면 default 사용 |
${var:=default} | var가 없으면 default 할당 |
${var:+value} | var가 있으면 value 사용 |
${var:?error} | var가 없으면 에러 |
${#var} | 변수 길이 |
${var^^} | 전체 대문자 |
${var,,} | 전체 소문자 |
"double quotes" | 변수 확장 허용 |
'single quotes' | 리터럴 문자열 (확장 없음) |
${var:0:5} | 위치 0부터 길이 5 부분 문자열 |
${var:7} | 위치 7부터 끝까지 |
${var: -4} | 마지막 4글자 (공백 주의) |
${var/old/new} | 첫 번째 항목 교체 |
${var//old/new} | 모든 항목 교체 |
${var#pattern} | 시작에서 최단 일치 제거 |
${var##pattern} | 시작에서 최장 일치 제거 |
${var%pattern} | 끝에서 최단 일치 제거 |
${var%%pattern} | 끝에서 최장 일치 제거 |
${file%.txt} | 예: .txt 확장자 제거 |
${path##*/} | 예: 경로에서 파일명 추출 |
arr=(a b c d) | 배열 생성 |
arr[0]="value" | 인덱스에 요소 설정 |
${arr[0]} | 인덱스의 요소 가져오기 |
${arr[@]} | 모든 요소 |
${#arr[@]} | 배열 길이 |
${!arr[@]} | 모든 인덱스 |
arr+=(e f) | 요소 추가 |
unset arr[1] | 인덱스의 요소 삭제 |
declare -A map | 연관 배열 선언 |
map[key]="value" | 키-값 쌍 설정 |
${map[key]} | 키로 값 가져오기 |
${!map[@]} | 모든 키 |
${map[@]} | 모든 값 |
unset map[key] | 키-값 쌍 삭제 |
if [[ condition ]]; then ... fi | 기본 if 문 |
if [[ cond ]]; then ... else ... fi | If-else 문 |
if [[ cond1 ]]; then ... elif [[ cond2 ]]; then ... fi | If-elif 문 |
[[ cond ]] && cmd | 축약 if (and) |
[[ cond ]] || cmd | 축약 if not (or) |
[[ -z "$str" ]] | 문자열이 비어있음 |
[[ -n "$str" ]] | 문자열이 비어있지 않음 |
[[ "$a" == "$b" ]] | 문자열이 같음 |
[[ "$a" != "$b" ]] | 문자열이 다름 |
[[ "$str" =~ regex ]] | 정규식 일치 |
[[ "$str" == pattern* ]] | 패턴 일치 (glob) |
[[ $a -eq $b ]] | 같음 |
[[ $a -ne $b ]] | 다름 |
[[ $a -lt $b ]] | 작음 |
[[ $a -le $b ]] | 작거나 같음 |
[[ $a -gt $b ]] | 큼 |
[[ $a -ge $b ]] | 크거나 같음 |
(( a == b )) | 산술 비교 |
[[ -e "$file" ]] | 파일 존재 |
[[ -f "$file" ]] | 일반 파일인지 |
[[ -d "$dir" ]] | 디렉토리인지 |
[[ -s "$file" ]] | 파일이 비어있지 않음 |
[[ -r "$file" ]] | 읽기 가능 |
[[ -w "$file" ]] | 쓰기 가능 |
[[ -x "$file" ]] | 실행 가능 |
[[ -L "$file" ]] | 심볼릭 링크인지 |
for i in 1 2 3; do echo $i; done | 기본 for 반복문 |
for i in {1..10}; do | 범위 (1부터 10) |
for i in {1..10..2}; do | 단계 포함 범위 (1,3,5,7,9) |
for file in *.txt; do | 파일 순회 |
for arg in "$@"; do | 인수 순회 |
for ((i=0; i<10; i++)); do | C 스타일 for 반복문 |
while [[ cond ]]; do ... done | While 반복문 |
until [[ cond ]]; do ... done | Until 반복문 (while의 반대) |
while true; do | 무한 루프 |
while read -r line; do ... done < file.txt | 파일을 줄 단위로 읽기 |
while IFS= read -r line; do | 읽을 때 공백 유지 |
break | 반복문 종료 |
break 2 | 2단계 반복문 종료 |
continue | 다음 반복으로 건너뛰기 |
continue 2 | 외부 반복문 계속 |
case $var in pattern1) cmd1 ;; pattern2) cmd2 ;; *) default ;; esac | Case 문 구조 |
a|b|c) | 여러 패턴 일치 |
*.txt) | Glob 패턴 매칭 |
[0-9]*) | 범위 패턴 |
;; | Case 블록 종료 (break) |
;& | 다음 case로 이동 |
select opt in opt1 opt2 opt3; do ... break; done | 대화형 메뉴 |
$REPLY | select에서 사용자 입력 번호 |
PS3="Choose: " | select용 사용자 정의 프롬프트 |
function name() { ... } | 키워드를 사용한 함수 |
name() { ... } | 함수 축약형 |
local var="value" | 함수 내 지역 변수 |
return 0 | 종료 상태 반환 (0-255) |
echo "result" | stdout으로 값 반환 |
$1, $2, ... | 함수 인수 |
$# | 인수 개수 |
$@ | 모든 인수 |
shift | 인수를 왼쪽으로 1개 이동 |
shift 2 | 인수를 왼쪽으로 2개 이동 |
result=$(func arg1 arg2) | 함수 출력 캡처 |
read var | 변수로 읽기 |
read -p "Prompt: " var | 프롬프트와 함께 읽기 |
read -s password | 조용히 읽기 (비밀번호용) |
read -t 5 var | 5초 타임아웃으로 읽기 |
read -n 1 char | 단일 문자 읽기 |
read -a arr | 배열로 읽기 |
read -r line | raw로 읽기 (백슬래시 이스케이프 없음) |
echo "text" | 줄바꿈과 함께 출력 |
echo -n "text" | 줄바꿈 없이 출력 |
echo -e "a\tb\n" | 이스케이프 시퀀스 활성화 |
printf "%s\n" "$var" | 형식화된 출력 |
printf "%-10s %d\n" "name" 42 | 형식 지정 printf |
cmd > file | stdout을 파일로 (덮어쓰기) |
cmd >> file | stdout을 파일로 (추가) |
cmd 2> file | stderr를 파일로 |
cmd &> file | stdout과 stderr 모두 리다이렉트 |
cmd 2>&1 | stderr를 stdout으로 |
cmd < file | 파일에서 stdin 읽기 |
cmd <<< "string" | Here-string |
$((a + b)) | 덧셈 |
$((a - b)) | 뺄셈 |
$((a * b)) | 곱셈 |
$((a / b)) | 나눗셈 (정수) |
$((a % b)) | 나머지 |
$((a ** b)) | 거듭제곱 |
((a++)) | 증가 |
((a--)) | 감소 |
((a += 5)) | 더하고 할당 |
echo 'scale=2; 5/3' | bc | 소수점 2자리 나눗셈 |
echo 'sqrt(2)' | bc -l | 수학 라이브러리로 제곱근 |
result=$(echo "$a + $b" | bc) | 부동소수점 덧셈 |
$(command) | 명령 치환 (권장) |
`command` | 명령 치환 (레거시) |
files=$(ls *.txt) | 명령 출력 저장 |
echo "Date: $(date)" | 인라인 치환 |
( cd /tmp && cmd ) | 서브쉘 (격리된 환경) |
{ cmd1; cmd2; } | 명령 그룹 (같은 쉘) |
diff <(cmd1) <(cmd2) | 두 명령의 출력 비교 |
while read line; do ... done < <(cmd) | 프로세스 출력에서 읽기 |
cmd > >(tee file) | 프로세스에 쓰기 |
/etc/profile | 시스템 전체 로그인 쉘 설정 |
/etc/bash.bashrc | 시스템 전체 대화형 쉘 설정 |
~/.bash_profile | 사용자 로그인 쉘 설정 |
~/.bashrc | 사용자 대화형 쉘 설정 |
~/.bash_logout | 로그아웃 시 실행 |
source ~/.bashrc | bashrc 다시 로드 |
export PATH="$PATH:/new/path" | PATH에 추가 |
export EDITOR="vim" | 기본 편집기 설정 |
alias ll="ls -la" | 별칭 생성 |
alias rm="rm -i" | 안전한 rm 별칭 |
HISTSIZE=10000 | 메모리 내 히스토리 크기 |
HISTFILESIZE=20000 | 히스토리 파일 크기 |
PS1="\u@\h:\w\$ " | 사용자 정의 프롬프트 |
\u | 사용자 이름 |
\h | 호스트명 (짧게) |
\H | 호스트명 (전체) |
\w | 현재 디렉토리 (전체) |
\W | 현재 디렉토리 (기본 이름) |
\d | 날짜 |
\t | 시간 (24시간) |
#!/usr/bin/env bash; set -euo pipefail | 안전한 스크립트 헤더 (엄격 모드) |
"$var" | 변수는 항상 따옴표로 감싸기 |
[[ ]] vs [ ] | [[ ]] 선호 (더 많은 기능, 더 안전) |
$(cmd) vs `cmd` | $() 선호 (중첩 가능, 더 명확) |
readonly CONST="value" | 상수에는 readonly 사용 |
local var | 함수 내에서 지역 변수 사용 |
shellcheck script.sh | ShellCheck으로 린트 검사 |
cmd || { echo "Error"; exit 1; } | 에러 처리 패턴 |
trap "cleanup" EXIT | 종료 시 정리 |
trap "echo Interrupted; exit" INT | Ctrl+C 처리 |
mktemp | 임시 파일 안전하게 생성 |
mktemp -d | 임시 디렉토리 안전하게 생성 |
cd "$(dirname "$0")" | 스크립트 디렉토리로 이동 |