개발/shell

[bash] 기초

방푸린 2023. 4. 25. 14:13
반응형

gshell은 bash의 상위호환 bash와 충돌나는 문법 없음

cshell은 구버전

 

Unix Shell
• Kernel을 둘러싸고 있는 껍데기
• 사용자가 제어할 수 있는 명령행 해석기

Bourne Shell
• 1977, Stephen Bourne
• /bin/sh

BASH (Bourne Again Shell)
• 1989, Brian Fox
• /bin/bash

 

ssh -> secure shell

-> 이걸로 게이트웨이까지 가고 그 이후론

rlogin -l 아이디 호스트명

이걸로 로그인

 

pwd: present working directory

id

uname: unix system  name -> os 정보 아키텍쳐 등

hostname

 

배쉬 내부 명령

command line argument(parameter)

echo는 기본적으로 new line이 나가기 때문에 그걸 무시하려면 -n옵션

 

ls

ls -1 파일 이름만 한줄에 하나씩

-a 숨겨진 것도

-F 파일

-l 롱포맷

 

ls 중 어떤 규칙만 필터 치고 싶다면..(패턴)

glob pattern

  • 임의의 길이(wildcard) *
  • 임의의 한 글자 ?

ls * -> 전체

ls .* -> 히든 전체

ls [a-f]*.txt -> a~f로 시작하는 텍스트 파일

ls *.tx? -> .txa 등의 확장자를 가진 파일

 

파일 시스템

  • File
    • OS에서 데이터를 디스크와 같은 저장소에 저장해 둘 때의 단위 형태
    • 넓은 의미에서는 일반 파일, 디렉토리와 각종 입출력 장치를 모두 파일로 간주
  • Directory
    • 파일을 담아두는 공간 (폴더)
    • 디렉토리 안에 디렉토리를 담을 수 있기 때문에 트리 구조로 형상화

 

cd : change directory

pwd

~ : 홈디렉토리

ls ~ 아이디 : 다른사람의 홈디렉토리

 

history

히스토리 중 다시 실행하고 싶다면

!12 : 히스토리 중 12번 재실행

!find : 히스토리 중 마지막 find로 실행했던 구문 재실행

!! : 바로 직전 명령 재실행

!$ : 바로 직전 명령의 마지막 argument

 

직전 명령 편집

echo "hello world"

^hello^java :hello -> java 변환(^ 캐럿이라고 부름)

 

touch

빈 파일 만들기, last modify date 바꿀 때

 

mkdir : make directory

rmdir : remove directory 빈 디렉토리만 삭제

 

cp 복사

mv 장소 이동, 이름 변경

rm 파일 삭제

rm -r : recursive하게 안에서부터 쫙 지우고 마지막으로 폴더 삭제

file /bin/gzip(파일) : 어떤 파일인데? 확인하는 용도

 

변수

사용자 변수
• 보통 소문자로 명명
• x=1
• x="hello world"
• x=hello world   (x)

주의사항

  • = 주위에 공백 없음

 

값을 꺼내쓰기(de-reference)

echo $x / ${x} / "$x"

 

single quote

  • literal, 문자열
  • 치환이 안됨

double quote(기본적으로 이거 사용)

  • 변수임

 

실행 결과를 변수로 저장

: backquote(`) 또는 $( )로 둘러싸기

date_str=`date +"%Y%m%d"`     
//            -> 날짜를 오른쪽 형식으로
date_str=$(date +"%Y%m%d")

 

명령 문자열을 실행하기

eval 명령문자열

  • cmd="ls –alF"
  • eval "$cmd

 

환경 변수

  • 환경(environment)
  • 프로세스를 둘러싼 주변 정보
  • env
  • 상속가능
  • export var1 = 2


exporting

  • sub-shell (쉘 안의 쉘)에서 상속받아 사용할 수 있도록 변수를 공개
  • 사용자 변수를 환경 변수로 전환
  • export나 declare –x로 지정

 

권한

u/g/o

chmod u+x test1.sh    
// -> owner에게 실행권한을 주기

실행 시 경로를 주거나 어떤걸로 실행할지 알려주면 됨

./test.sh
bash test.sh

 

소유자 변경

chown 아이디 파일

 

Boolean expression


&&, ||, !, –a, –o 

  • -a = &&이고 -o = ||

(( 0 && 1 )) && echo true || echo false   

  • -> then else
  • ((식)) && 참이면 실행 || 거짓이면 실행

(( 0 || 1)) && echo true || echo false

  • integer
    -eq -ne -gt -ge -lt –le

  • string
    < <= > >= = != -z –n
  • -z : zero length?
  • -n : null?

 

if

세미콜론, 공백과의 싸움

if [ 조건 ]; then
	실행문
fi

한 줄 쓰기

x=3; if [ $x –eq 3 ]; then echo "x is 3"; fi

 

주의사항

  • -eq 연산자는 정수 연산자
  • = 연산자는 문자열 연산자
  • 변수가 정의되지 않았거나 공백을 포함할 수 있으므로 quotation 필요
x="he llo"
if [ "$x" = "he llo" ]; then echo "$x"; fi

 

  • ==는 shell마다 약간 호환성 차이가 있음, 하나(=)를 써라

 

for/while

for loop은 foreach 형식만 지원

for(int i = 0; i <10; i++)의 형식은 while문으로 작성해야 함

while [ 조건 ]; do
	실행문
done
i=3; while [ "$i" -lt 10 ]; do echo "$i"; i=$((i+1)); done
3
4
5
6
7
8
9

무한루프 :

while :; do
	date
	sleep 5
done

or watch 명령어로 주기적으로 감시 가능

watch -n 5 "date"

for

for 변수명 in 리스트; do
	실행문
done

 

for dir in *; do
//* : 현재 경로의 파일/디렉토리를 dir에 바인딩
	[ -d "$dir" ] && (echo -n "$dir   "; cd "$dir"; ls | wc –l)
    //[ ] 가 참이면 ()를 실행
    // -d dir이 디렉토리냐?
    //에코쓰고 이동하고 안에 있는 파일의 갯수를 찍어(현재 디렉토리 하위 디렉토리 안의 파일 갯수 확인)
    //서브쉘이 끝나면 원래 디렉토리로 돌아옴; 돌아오는 코드 귀찮아서 서브쉘 
    //서브쉘 중간에 실패 시 자동으로 오니까..
done

swtich-case 문

case 변수 in 
케이스1)
	실행문;; 
케이스2) 
	실행문;;
*)
	실행문;;
esac

 

입출력 리다이렉트

 

1(생략) 이거 아니고 0(생략) 이거임! 0번이 표준입력

합칠 수도 있다!

 

필터

프로세서의 출력을 다른 프로세스의 입력으로 전달

  • | 파이프 기호를 이용
  • ls | head : ls의 출력을 head의 입력으로 받아

line by line으로 세서 출현 빈도 수로 정렬

cat test.txt | sort | uniq –c | sort -n
  • sort 알파벳순 정렬
  • uniq -c 중복을 없애면서 중복 갯수를 출력(카운트 옵션)
  • sort -nr  맨 앞을 숫자로 보겠다, 출현 빈도수가 높은걸 맨 앞으로 두고 나머지를 두라(r옵션이 desc)
find /etc 2>&1 | grep 허가
//찾아 여기서 에러랑 아닌거 같이 모아서 허가 찾아

 

문서 보기

cat은 페이징 없음

more/less 페이지씩 보여줌 엔터치면 더 보여줌(pager)

grep 문자열 파일

grep -r (모든 파일에 대해 recursive 하게 검색)

grep bash .bashrc | less -eMR

head 앞에 몇 줄만

tail 뒤에 몇 줄만 tail -f 최근 접속 실시간 출력

 

잘라내서 쓰기

cut –d 구분자 –f 필드번호 파일

구분자로 split해서 시작번호는 1번부터

1,3,4,7번째를 모아서 :로 붙여서 보여줌

grep irteam /etc/passwd | cut –d: –f1,3-4,7

 

shebang(#!)쉐벵

  • 어떤 인터프리터 프로그램을 사용할 것인가를 지정
  • #!/bin/bash
  • #!/usr/bin/env python
    • 권장하는 방식
    • 지정해주면 파이선으로 실행하지 않고 배쉬로 실행해도 배쉬가 첫 줄을 보고(인터프리터) 파이선인지 파악하여 파이선으로 실행 함
    • 리눅스 포직스(?)

 

commane line arguments

$0 자기자신 쉘 이름

$# 변수 몇 개?

$? 실행 결과 0:정상; 0이 아니면 에러

 

설정

Bourne shell

  • ~/.profile

Bash

  • login shell
  • bashrc
  • non-login shell
  • bash_profile -> 이거 하나 만 만들고 그 안에서 rc를 불러오도록 하는게 좋음

바로 적용(source)

source ~/.bashrc

 

find

find 디렉토리 목록 –name 이름패턴 –type 파일유형

find /usr/lib64
find /usr/lib64 –name "lib*.a" –ls
find /usr/lib64 –type d –name "py*"
find /usr/lib64 \( –name "python*" –o –name "pgsql*" \) –ls

 


쉘 문법 체크: shellcheck

컴퓨터에 깔아서 쓸 수도 있고, 인텔리제이 플러그인으로도 있다고 함

https://www.shellcheck.net/

 

ShellCheck – shell script analysis tool

ShellCheck finds bugs in your shell scripts

www.shellcheck.net

 

728x90
반응형