본문 바로가기

Programming

Linux ShellScript 정리

pwd

현재 디렉토리의 전체 경로를 표시

Synopsis
 없음
 
Option
 없음
 
Example

$ pwd
    > /home/username

cd

 현재 디렉토리의 이동
 
Synopsis
 cd [디렉토리]
 ※상대 경로, 절대 경로 모두 가능
 
Option
 없음
 
Example

홈 디렉토리로 이동  
    > $ cd  ~

루트 디렉토리로 이동  
    > $ cd  /

상위 디렉토리로 이동  
    > $ cd  ../

ls

파일또는 디렉토리의 일람을 표시

Synopsis
 ls [옵션] [디렉토리or파일]

Option
 -a :『. (점) 』으로 시작하는 파일명도 표시
 -l :상세정보(권한. 파일의 주인, 일시)를 표시
 -d :현재 디렉토리 자신의 정보를 표시
 -t :최종 변경 시간으로 정렬하여 표시
 -r :최종 변경 시간의 역순으로 표시
 -1 :파일명만 표시
 
Example

현재 디렉토리의 파일을 전부 표시
    > $ ls -a

현재 디렉토리 자신의 상세정보만을 표시
    > $ ls –dl ./

루트 디렉토리에 있는 모든 디렉토리명 표시
    > $ ls –d /*

/etc 디렉토리 중 『 h 』로 시작하는  것들을 최신일 순으로 표시
    > $ ls –t /etc/h*

mkdir / rmdir

 mkdir 디렉토리를 신규작성
 rmdir 빈 디렉토리를 삭제

Synopsis
 mkdir [옵션] 디렉토리1 디렉토리2
 rmdir [옵션] 디렉토리
 ※디렉토리는 복수 지정 가능(스페이스로 구분)

Option
 mkdir –m MODE:작성할 디렉토리의 권한(MODE)을 지정
 mkdir –p :지정 할 디렉토리의 상위 및 중간 디렉토리일괄 작성
 rmdir –p :지정 된 계층까지 비어있는 디렉토리를 일괄 삭제

Example

(현재 디렉토리에)디렉토리 a, b, c를 한번에 작성  
    > $ mkdir a b c

디렉토리 ./a/aa, ./a/aa/aaa, ./a/aa/aaa/x를 한번에 작성  
    > $ mkdir –p  ./a/aa/aaa/x

디렉토리 d 을 권한 777로 작성  
    > $ mkdir –m 777 d

디렉토리 ./d 을 삭제 
    > $ rmdir ./d

디렉토리 ./a/aa, ./a/aa/aaa, ./a/aa/aaa/x  를 한번에 삭제
    > $ rmkdir –p  ./a/aa/aaa/x

echo

 문자열이나 변수를 표준 출력(표시)

Synopsis
 echo [옵션] [문자열]
 
 ※문자열에는 변수를 지정하는 것도 가능

Option
 -n 마지막의 개행을 출력하지 않음

Example

지정된 문자열을 화면에 표시
    > $ echo "Hello World"

변수${USER}의 값을 화면에 표시
    > $ echo "USER=[${USER}]"

문자열「${USER}」을 화면에 표시  
    > $ echo 'USER=[${USER}]'

※""일 경우 변수의 값이 표시
※``일 경우 변수의 이름 표시

리다이렉트(리다이렉션) [>] [>>]

 표준 출력으로부터 파일을 변경

 Synopsis
 표준 출력을 수반하는 처리 > 파일명

 Example

문자열을 [hw.txt]파일에 출력
    > $ echo "Hello World"  > ./hw.txt ※파일을 한번 지우고 새로 쓴다.

문자열을 [hw.txt]파일에 출력
    > $ echo "Hello World"  >> ./hw.txt  ※파일의 말미에 추가 기입한다.

touch

파일의 타임스탬프 변경
지정된 파일이 없을 경우, 내용이 없는 0바이트의 파일을 작성

Synopsis
 touch [옵션] [파일]

Option
 -t [[CC]YY]MMDDhhmm[.SS]: 시간을 지정하여 변경
 
※「CCYYMMDDhhmmSS」은「년・월・일・시・분・초」를 의미한다.
※「CC」, 「YY」, 「SS」은 생략 가능

Example

빈 test.txt파일을 작성
    > $ touch  test.txt

test.txt파일의 날짜를 2017/1/1 0으로 변경 
    > $ touch  -t "201701010000" test.txt

cat

파일 내용 확인
2개 이상의 파일을 연결하여 출력할 때 편리
 
Synopsis
 cat [옵션] [파일명]
 
Option
 -n:공백행도 포함해서 행 번호를 매겨 출력
 -b:공백행을 제외하고 행번호를 붙여서 출력

Example

파일의 표시 
    > $ cat  filename.txt

more/less コマンド

텍스트 파일의 내용을 한 화면씩 표시

Synopsis
 more [파일명] / less [파일명]
 ※more 과 less 의 다른 점은 파일의 말미에 도착했을 때 more은 종료 되나 less는 유지된다.
 ※less에 더 많은 기능이 있으며 자세하게 보고 싶을 때 사용하면 좋다.
 
Option
 less -N : 행의 번호 부여
 
Example

test.txt파일의 표시
 > $ less  test.txt

※ more/less 모드에서 중요 단축키

 Space        : 1페이지 다음으로 이동
 Enter        : 1행 이동
 /            : 검색
 n            : 다음 검색
 Ctrl+f    : 1페이지 다음으로 이동
 Ctrl+b     : 1페이지 이전으로 이동
 G            : 맨 마지막 행으로 이동(less만 있음)
 q            : 완료

mv

파일/디렉토리의 이름을 변경
파일/디렉토리을 이동

Synopsis
 mv [옵션] [원본 파일명] [새로운 파일명]
 mv [옵션] [이동 전 파일] [이동할 디렉토리]
 ※디렉토리의 경우에도 동일
 
Option
 -i : 덮어쓰기 확인
 
Example

파일명을 변경 
    > $ mv  before.txt  after.txt

파일을 서브 디렉토리a에 이동
    > $ mv  before.txt  ./a/

cp

파일 또는 디렉토리를 복사한다.
※ 복사 원본 파일은 남음.
 
Synopsis
 cp [옵션] [원본 파일명/디렉토리명] [복사 할 파일명/디렉토리명]
 
Option
 -i : 복사 된 파일과 같은 이름의 파일이 존재할 경우, 덮어씌울 것인지 확인
 -r : 디렉토리 전부를 복사
 -p : 원본 파일의 속성 정보(권한/소유자/변경일 등)을 보존한 상태로 복사

Example

파일을 속성 정보 까지 복사
    > $ cp -p  ./filename.txt  ./cp_filename.txt

디렉토리를 복사한다.
    > $ cp -r  ./dir_name  ./cp_dir_name

rm

파일 또는 디렉토리의 삭제
 
Synopsis
 rm [옵션] [파일명/디렉토리명]

Option
 -i : 파일 삭제 확인
 -f : 삭제 확인을 무시하고 강제로 삭제
 -r : 디렉토리를 삭제 대상으로 함.
 ※ 삭제 대상 디렉토리의 안에 있는 파일 또는 디렉토리가 있는 경우, 그 것들도 삭제
 
Example

파일을 삭제(확인)
    > $ rm -i ./filename.txt

디렉토리를 삭제
    > $ rm -r  ./dir_name

vi

텍스트 파일을 작성・편집・보존

Synopsis
  vi [대상 파일]
  ※파일이 존재하지 않는 경우 현재 시간으로 새로운 파일을 생성
 
Option
 view로 열면 읽기 전용 모드가 된다.
 vi에디터에는【커맨드 모드】와【편집모드】가 있다.
 【커맨드 모드】커서 조작・문자의 삭제・ 파일의 보존・종료를 행하기 위한 모드. 문자의 입력은 되지 않는다.
 【편집모드】문자의 입력을 위한 모드. 커서 조작・ 파일의 보존・종료는 할 수 없다

Example

모드의 변경
커맨드 모드 ⇒ 편집 모드    : 편집 커맨드를 입력
편집 모드 ⇒ 커맨드 모드    : Esc키를 누름

find

파일 또는 디렉토리의 검색을 실시(Option으로 세밀한 검색 조건 설정 가능)
검색 조건(Option)으로 지정가능한 조건은 파일지정・디렉토리지정・갱신 시간 지정・사이즈 지정 등 여러가지

Synopsis
 find [대상 디렉토리] [검색 조건] [액션]
 
Option
-name : 이름을 지정하여 검색(명칭에는 와일드 카드 사용 가능)
-type f : 파일만을 검색 대상으로 함
-type d : 디렉토리만을 검색 대상으로 함
-ls : 검색 결과 대상의 상세정보를 표시
-exec {} ; : 검색 결과를 {} 에 적용시키고 커맨드를 실행
-mtime [+|-]n : n일 이상 혹은 n일 이내에 변경 된 파일
-newer file명 : 지정 된 파일의 타임스탬프 보다 새로운 파일
-empty : 빈 파일/디렉토리을 대상으로 함
 
Example

/home에서 test로 시작하는 파일만을 검색  
    > $ find /home -type f -name "test*"

7일 이상 전에 변경 된 파일을 검색
    > $ find ./  -type f -mtime +6

7일이내에 변경 된 파일을 검색하고 상세정보 표시
    > $ find ./  -type f -mtime -8 -ls

7일 이상 전에 변경 된 파일을 삭제  
    > $ find ./  -type f -mtime +6 -exec rm -f {} \;

grep

어떤 특정 문자열이 파일안에 포함되어 있는지 검색 
※ 파이프를 사용하는 것으로 커맨드의 실행 결과로 부터 문장을 추출하는데 자주 사용된다.
 
Synopsis
 grep [옵션] [검색 문자열] [검색 대상 파일]
 ※ 검색 문자열에는 정규식、검색 대상 파일에는 와일드카드 지정 가능
 
Option
 -i :대소문자 구별 없이 검색
 -n :번호 표기
 -v :검색 결과와 일치하지 않는 문자열 표시
 -l :검색 결과의 파일명 표시
 -r :서브디렉토리도 검색 대상으로 함
 
Example

파일「test.txt」안에「test」가 포함되어있는 행을 검색  
    > $ grep "test" test.txt

파일「test.txt」안에서 비어있는 행의 위치를 검색 
    > $ grep -n "^$" test.txt    #정규표현을 사용『^(행의 첫부분)이 $(행말) 』

./ 아래「test」가 포함되어 있는 파일명을 표시
    > $ grep -lr "test" ./*

diff

2개 파일의 차이를 출력

Synopsis
 diff [옵션] 파일1 파일2
 
Option
 -r :디렉토리를 동시에 비교
 -y :2개의 파일을 좌우로 두고 비교
 -i :대소문자 차이를 무시
 -c/-u :비교결과를 변경하여 표시
 ※ -c : Context형식, -u : Unified형식

Example
 없음  

| (파이프)

커맨드와 커맨드를「|(파이프)」으로 연결하는 것으로, 파이프의 앞의 커맨드 실행 결과(표준 출력)을 뒤의 커맨드의 표준 입력으로 실행하는 것이 가능하다.

Synopsis
 커맨드 | 커맨드

Option
 없음

Example

find으로 검색 한 파일리스트를 더욱 좁혀서 표시
    > $ find ./  |  grep  "test"

find으로 검색 한 파일리스트를 페이징 하여 표시
    > $ find ./  |  less

grep으로 검색 한 결과를 더욱 좁혀서 표시
    > $ grep -i  "test"  |  grep -v "Test"

grep으로 검색 한 결과를 표시하기 전에 몇 행인지 확인
    > $ grep -i  ./*  |  wc -l
    ※ wc -l [파일명] 은 filename가 몇 행인지 표시하는 커맨드

grep검색한 결과를 오름차순으로 정렬해 표시
    > $ grep -i  ./*  |  sort
    ※ sort 출력 결과를 정렬하는 명령(옵션은 없음으로 오름차순으로 정렬)
**잘못되기 쉬운 예제**

cat  ./filename  |  less  :cat의 결과를 페이징하여 표시 
    > cat은 필요 없음

ls -l  |  grep  "test"  :ls결과로 부터 test포함한 것을 추출
     > 와일드 카드를 사용하는 수 밖에 없다.「ls -l  "*test*"」

※위 결과는 실행 가능하나 퍼포머스 성능이 달라진다.

su

현재 계정을 로그아웃을 하지 않고 다른 계정으로 전환하는 명령어

Synopsis
 su [옵션] [유저명]

Option
​ - : 지정한 유저의 프로파일을 넣음
​ 유저명 : 변경 대상의 유저명(생략 시 root유저로 변경 됨)

Example

유저를 변경
    > $ su  username

유저를 변경(프로파일을 넣는다)
    > $ su  -  username

root 유저로 바꿈
    > $ su  -  [root]

w/who/whoami コマンド

 w : 로그인 유저와 실행 프로세스를 표시
 who : 로그인 상황과 로그인 유저의 정보를 표시
 whoami :현재 자신의 유저명을 표시

Synopsis
 w [옵션] [유저명]
 who [옵션]
 whoami

Option
  w :-h : 헤더 정보를 표시하지 않는다
  who :-q : 로그인 되어있는 유저명과 인원 수를 표시
  who :-H : 헤더 정보를 표시한다.

Example

로그인 유저를 표시
    > $ who

username유저의 정보를 표시
    > $ w  username

현재 자신의 유저명을 표시
    > $ whoami

chmod、chown

chmod : 파일의 권한 변경
chown : 파일의 소유자 변경

Synopsis
 chmod [지정할 권한] [파일/디렉토리]
 chown 유저명[:그룹명]  [파일/디렉토리]

Option
chmod으로 지정할 접근권한[8 진수표기]
아래 표의 총 값을 Option에 지정하고 부여할 권한 설정

user group other
rwx rwx rwx
111 111 111
421(7) 421(7) 421(7)

chmod로 지정하는 접근권한 [콤마로 구분]  
권한마다 퍼미션의+(추가)-(삭제) 변경하는 권한을 지정하다

(r:읽기 권한 / w:쓰기 권한 / x:실행 / 디렉토리변경 권한)
chown은 유저ID와 그룹ID의 지정도 가능 (ls -n 으로 표시가능)

Example

(예 : -rw-rw-rw- 1 penguin lpic 124 3 月 27 19:09 filename)

권한을 『-rwxr-xr--』으로 변경(8진수)
    > $ chmod  754  filename

권한을 『-rwxr-xr--』으로 변경(콤마로 구분)
    > $ chmod  u+x,g-w+x,o-w  filename

head、tail

Synopsis
 head [옵션] [파일명]
 tail [옵션] [파일명]

Option
  -n : 선두 혹은 말미로부터 지정 된 행 을 출력 (-도 가능)
  -c : 선두 혹은 말미로부터 지정 된 문자 수를 출력
  tail -f : 대기 모드가 되어 파일에 새로 추가된 줄을 표기한다.

Example

echo "first" >> test.txt
echo "first" >> test.txt
echo "seconds" >> test.tx
echo "third" >> test.txt

tail -f test.txt
    > first
    > seconds
    > third

shell script

Excute
 $ sh ./[파일명]
 $ bash ./[파일명]
 $ ./[파일명]

Value
변수 지정
​ > [변수명]=[값]

변수 호출
​ > ${변수명}

특수 변수
​ > $0 : 스크립트 자신의 이름
​ > $1, $2 ... : 인수
​ > $# : 인수의 개수
​ > $* : 인수를 하나씩 표시 ( 리스트로 보여준다 )
​ > $@ : 인수를 하나씩 표시 ( 구별지어 보여준다 )

#!/usr/bin/bash

echo ${0}
echo ${1}
echo ${#}
for arg in "$*"; do echo "<$arg>"; done
for arg in "$@"; do echo "<$arg>"; done
test.sh
1
3
<1 2 3 4>
<1>
<2>
<3 4>

if

if [ 100 -eq 99 ]; then
    echo "equal"
else
    echo "not equal"
fi

for

for i in 1 2 3 4 5
do
    total='expr $total + ${i}'
    echo ${total}
done

while

i=1;
while((i < 6))
do
    echo ${i}
    i=$(( i + 1 ))
done

Compare
​ A -eq B : 두 값이 같을 경우
​ A -ne B : 두 값이 다를 경우
​ A -gt B : A가 B보다 클 경우
​ A -lt B : A가 B보다 작을 경우
​ A -ge B : A가 B이상일 경우
​ A -le B : A가 B이하일 경우

String Compare
​ 문자열 : 문자열의 길이가 0보다 클 경우
​ -n 문자열 : 문자열의 길이가 0보다 클 경우
​ -z 문자열 : 문자열의 길이가 0일 경우
​ 문자열A = 문자열B : A가 B가 같을 경우
​ 문자열A != 문자열B : A가 B가 다를 경우

File Option
-d [파일명] : 해당 파일이 디렉토리에 있는지 확인
-f [파일명] : 해당 파일인지 확인
-e [파일명] : 해당 파일이 존재하는지 확인
-L [파일명] : 심볼릭이 있는지
-r [파일명] : 읽기 가능인지 확인
-w [파일명] : 쓰기 가능인지 확인
-x [파일명] : 실행 가능인지 확인
-s [파일명] : 파일이 존재한다면 파일이 비어있지 않는지
-S [파일명] : 파일이 소켓인지
File A -nt File B : 파일 A가 파일 B보다 새로운 경우
File A -ot File B : 파일 A가 파일 B보다 오래된 경우