기본
echo & 탐색
echo "Hello, World!" # print text pwd # print working directory cd /path/to/dir # change directory cd .. # go up one level cd ~ # go to home directory cd - # go to previous directory
파일 목록 & 생성
ls # list files ls -la # long format, show hidden ls -lh # human-readable sizes mkdir mydir # create directory mkdir -p a/b/c # create nested directories
복사, 이동 & 삭제
cp file.txt copy.txt # copy file cp -r dir/ backup/ # copy directory recursively mv old.txt new.txt # rename / move rm file.txt # delete file rm -r dir/ # delete directory recursively rm -rf dir/ # force delete (no prompt)
변수 & 확장
변수
name="Alice" # assign (no spaces!) echo "$name" # variable expansion echo "${name}_file" # braces for clarity readonly PI=3.14 # constant unset name # delete variable
특수 변수
$0스크립트 이름
$1 $2 ...위치 인수
$#인수 개수
$@모든 인수 (개별 단어)
$*모든 인수 (단일 문자열)
$?마지막 명령의 종료 상태
$$현재 프로세스 ID
$!마지막 백그라운드 프로세스 PID
명령 치환 & 산술
files=$(ls) # capture output today=$(date +%Y-%m-%d) # command substitution count=$((5 + 3)) # arithmetic: 8 echo $((10 / 3)) # integer division: 3 echo $((10 % 3)) # modulo: 1
문자열 연산
${#str}문자열 길이
${str:0:5}부분 문자열 (오프셋:길이)
${str/old/new}첫 번째 매칭 교체
${str//old/new}모든 매칭 교체
${str^^}대문자 변환
${str,,}소문자 변환
조건문
if / elif / else
if [[ "$name" == "Alice" ]]; then echo "Hi Alice" elif [[ "$name" == "Bob" ]]; then echo "Hi Bob" else echo "Who are you?" fi
테스트 연산자
-eq -ne정수 같음 / 다름
-lt -gt정수 작음 / 큼
-le -ge정수 작거나 같음 / 크거나 같음
== !=문자열 같음 / 다름
-z "$str"문자열이 비어 있음
-n "$str"문자열이 비어 있지 않음
-f file파일이 존재하고 일반 파일
-d dir디렉토리 존재
-e path경로 존재 (모든 유형)
-r -w -x읽기 가능 / 쓰기 가능 / 실행 가능
&& ||논리 AND / OR
반복문
for 반복문
for fruit in apple banana cherry; do echo "$fruit" done for f in *.txt; do echo "File: $f" done
C 스타일 for 반복문
for ((i=0; i<5; i++)); do echo "$i" done
while 반복문
count=0 while [[ $count -lt 5 ]]; do echo "$count" ((count++)) done
반복문 제어
break반복문 종료
continue다음 반복으로 건너뜀
함수
정의 & 호출
greet() { echo "Hello, $1!" # $1 = first arg return 0 # exit status } greet "Alice" # Hello, Alice!
지역 변수 & 반환값
add() { local sum=$(($1 + $2)) echo "$sum" # "return" via stdout } result=$(add 3 5) # capture: 8
파이프 & 리다이렉션
파이프
ls -l | grep ".txt" # pipe output cat log | sort | uniq # chain commands cmd1 | tee out.txt # pipe + save to file
리다이렉션
cmd > filestdout 리다이렉트 (덮어쓰기)
cmd >> filestdout 리다이렉트 (추가)
cmd < file파일에서 stdin 읽기
cmd 2> filestderr 리다이렉트
cmd 2>&1stderr를 stdout으로 리다이렉트
cmd &> filestdout + stderr 리다이렉트
cmd << EOF히어 다큐먼트 (인라인 입력)
/dev/null출력 폐기: cmd > /dev/null
파일 작업
파일 보기
cat file.txt # print entire file head -n 10 file.txt # first 10 lines tail -n 10 file.txt # last 10 lines tail -f log.txt # follow (live updates) less file.txt # paginated viewer
계산 & 검색
wc -l file.txt # count lines wc -w file.txt # count words wc -c file.txt # count bytes find . -name "*.txt" # find by name find . -type d # find directories find . -mtime -7 # modified in last 7 days
기타 파일 명령
touch file파일 생성 / 타임스탬프 갱신
stat file파일 메타데이터 (크기, 날짜)
file img.png파일 유형 감지
diff a.txt b.txt두 파일 비교
sort file.txt줄 정렬
uniq인접 중복 제거
cut -d: -f1구분자로 필드 추출
tr 'a-z' 'A-Z'문자 변환 / 교체
텍스트 처리
grep
grep "error" log.txt # search for pattern grep -i "error" log.txt # case-insensitive grep -r "TODO" src/ # recursive search grep -n "func" file.go # show line numbers grep -c "error" log.txt # count matches grep -v "debug" log.txt # invert match
sed
sed 's/old/new/' file # replace first per line sed 's/old/new/g' file # replace all sed -i 's/old/new/g' file # edit in place sed -n '5,10p' file # print lines 5-10 sed '/pattern/d' file # delete matching lines
awk
awk '{print $1}' file # print first field awk -F: '{print $1}' file # custom delimiter awk '$3 > 100' file # filter by field value awk '{sum+=$1} END{print sum}' file # sum column
퍼미션
chmod
chmod 755 script.sh # rwxr-xr-x chmod +x script.sh # add execute chmod -w file.txt # remove write chmod u+x,g-w file # user +exec, group -write
퍼미션 참조
r (4)읽기
w (2)쓰기
x (1)실행
u / g / o소유자 / 그룹 / 기타
755소유자: rwx, 그룹/기타: r-x
644소유자: rw-, 그룹/기타: r--
소유권
chown user file.txt # change owner chown user:group file.txt # change owner + group chown -R user:group dir/ # recursive