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로 지정
권한
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
입출력 리다이렉트
합칠 수도 있다!
필터
프로세서의 출력을 다른 프로세스의 입력으로 전달
- | 파이프 기호를 이용
- 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
컴퓨터에 깔아서 쓸 수도 있고, 인텔리제이 플러그인으로도 있다고 함
ShellCheck – shell script analysis tool
ShellCheck finds bugs in your shell scripts
www.shellcheck.net
'개발 > shell' 카테고리의 다른 글
[shell] return & exit (2) | 2024.09.25 |
---|---|
[shell] > 와 & 에 대한 고찰 (0) | 2022.01.11 |