Loading [MathJax]/jax/output/CommonHTML/jax.js

리눅스 쉘 명령어 메모

Memo 2021. 10. 23. 11:33
반응형

참고할 곳

https://blog.gaerae.com/2015/01/bash-hello-world.html

 

Bash 입문자를 위한 핵심 요약 정리 (Shell Script)

 

blog.gaerae.com

https://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/

 

고급 Bash 스크립팅 가이드

본 튜토리얼은 여러분이 Bash에 대해서 어떠한 사전 지식도 없다고 가정을 합니다만, 금방 중/고급 수준의 명령어들을 소개합니다(...유닉스의 슬기롭고 교훈적인 부분들을 배워 나가면서). 이 문

wiki.kldp.org

 

$ ls -l 파일명  : 파일 정보 보기

$ ls -l f*  : f로 시작하는 파일보기

$ ls -l f?ile  : ?에 한 글자 

$ ls -l f[ab]*

$ ls -l f[!ab]*

$ id ; date ; who   : 여러 명령 동시 실행

$ ( id ; date ; pwd )

$ { id ; date ; pwd; }   : 반드시 요렇게 해야. 양쪽 띄어쓰기, 마지막에 세미콜론

$ ps -f

$ sleep 10

$ sleep 1000 &  : Background 실행

$ ps -f  : 이 명령 주면 Background에서 작동하는 process 확인 가능

$ jobs  : Background에서 작동하는 process만 확인 가능

$ kill -9 [프로세스아이디]

$ jobs

$ fg %[job번호]  : 실행했던 명령어 볼 수 있음. foreground

$ bg %[job번호]  : 실행했던 명령어 볼 수 있음. background

$ whereis ls  : ls 명령어는 어디있니?? alias는 안 찾아짐

$ alias [별칭]='[명령어]'  => alias c='clear' 

$ alias -p  : 별칭 목록

==> alias는 모든 bash 쉘에 적용되지 않음

==> 안 된다고 당황하지 말고, ps -f 입력하여 실행 중인 process, bash를 확인하자.

$ taill /etc/passwd

xuser:x:1000:1000:xuser:/home/xuser:/bin/bash

==> 로그인을 하면 /home/xuser 경로로 감

 

$ set | more  : 모든 변수 목록 확인할 수 있음

$ printenv | more  : 전역(환경) 변수만 확인. export된 변수 보여줭ㅋ

$ aa=kim  : 변수 추가 (지역변수로 추가)

$ set | grep aa  : 추가된 변수 확인하기

$ echo $aa

$ bash  로 새로운 bash를 열어 들어가 echo $aa 를 쳐보면 아무것도 출력되지 않음

aa를 추가했던 bash 쉘에서 $ export aa 를 입력하면 aa가 전역으로 등록되어 하위 bash에서도 이용이 가능함

Node.js에서 자주 봤던 export 명령어의 정체는 이것이었나 보다.

$ unset aa  : 더 이상 변수를 이용하고 싶지 않을 때 입력

$ chmod +x a.sh

$ mv a.sh bin  : a.sh를 bin으로 옮김. 아... 파일명 안 적어도 옮겨지는구나!

그리고 이렇게 옮겨 넣으면 ./a.sh가 아니라 a.sh만 입력해도 실행되는데, 

PATH에 /home/xuser/bin이 등록되어 있기 때문!

$ PS1="$ "  : 프롬프트 모양 변경

==> [xuser@localhost ~]blah blah 로 바꿀 수 있다.

 

$ mkdir pathtest

$ cat > b.sh

$ chmod +x b.sh

$ mv b.sh pathtest

$ PATH=PATH:HOME/pathtest

$ echo $PATH

 

/etc/profile: 시스템 전역변수 초기화, 시스템 전역 쉘 변수 초기화

/etc/bashrc: 쉘 함수와 앨리어스를 위한 시스템 전역 변수 정의

~/.bash_profile: 유저 개인의 환경 설정 파일, 자신만의 PATH, 시작 프로그램을 추가로 설정

~/.bashrc: 유저 개인의 앨리어스 및 변수 설정 파일

~/.bash_logout: 로그아웃 설정 파일

 

$ more /etc/profile

$ cat .bash_profile

 

$ cat > var.sh

name=kim

city=seoul

echo $name

echo $city

[ctrl] + D

$ chmod +x var.sh

$ ./var.sh

$ echo $name 

--> 쉘 스크립트에서 설정한대로 나타나지 않음

--> 별도의 process를 만들어서 실행하기 때문에 안됨

$ . ./var.sh

$ source ./var.sh

--> 현재 bash process에서 실행

--> 자식 프로세스를 만들지 않고 현재 쉘 환경에서 명령 실행

$ echo $name

$ echo $city

 

특수 파라미터 변수들

$?: 가장 최근에 실행된 파이프라인의 종료상태 가짐

$-: 쉘의 모든 옵션 목록

$$: 현재 쉘의 

$!: 가장 최근에 백그라운드로 실행된 프로세스 ID

$0: 쉘 또는 쉘 스크립트의 이름

$ echo pwd

--> 백 쿼터(`)로 실행하면 pwd의 실행 결과값이 나타남

 

$ echo $aa

$ echo "$aa"

--> 둘의 결과값은 동일하게 aa 변수에 입력된 값이다.

 

$ echo ${aa}

$ echo ${aa:-banana}

$ echo ${bb:-banana}

--> aabb에 값이 설정되지 않았다면 banana를 출력

$ echo ${bb:=banana}

--> bbbananabb에 banana 입력

$ echo $var

$ echo ${var:3} 

--> 문자열이 0부터 옵셋 시작, 옵셋부터 시작

$ echo ${var:3:4}

--> 옵셋부터 길이 만큼

 

$ pm="/usr/bin/local/bin"

$ echo ${pm%/bin*}  : 뒤에서부터 /bin*패턴 중 좁은 걸 제거

/usr/bin/local

$ echo ${pm%%/bin*}  : 뒤에서부터 /bin*패턴 중 넓은 걸 제거

/usr

 

$ pm="/usr/bin/local/bin"

$ echo ${pm#/bin*}  : 앞에서부터 /bin*패턴 중 좁은 걸 제거

$ echo ${pm##/bin*}  : 앞에서부터 /bin*패턴 중 넓은 걸 제거

 

$ {#pm}  : 변수에 할당된 값의 문자 개수 치환

 

$ echo $pwd  : pwd라는 변수를 출력

$echo $(pwd)  : pwd라는 명령어의 결과를 출력

$ man date  : 명령어의 옵션들 확인하기. 메뉴얼(manual)q

$ aa=$(pwd)  : 이런 식으로 pwd 명령어 실행 결과를 변수에 입력할 수 있음

 

$ bb=$(basename $(pwd))

$ bb=basename`pwd`

--> basename과 pwd 명령어를 복합적으로 이용할 수 있음

 

$ cat > aa.out  : 출력 리다이렉션

$ cat < aa.out  : 입력 리다이렉션

$ cat >> aa.out  : 추가 출력을 리다이렉션

$ ls -l > file1  : ls -l의 실행 결과가 file1에 입력

 

$ wc

test lee park bye

[ctrl] + D --> 라인수/단어개수/전체글자수 출력

 

$ wc < file1  : file1의 텍스트를 가져와 위의 정보 출력

 

$ cat << DONE  : DONE를 만날 때까지 입력을 계속 받음

> test3  (출력됨)

> kim  (출력됨)

> seoul  (출력됨)

> DONE (출력되지 않음)

 

$ cat << END > file2  : END를 만날 때까지 입력하고, 입력된 내용을 file2로 출력함

$ rpm -qa | sort > rpm.list  : 설치된 패키지 목록을 정렬하여 rpm.list에 저장

파이프(|) 명령  : 한 명령에서 직접 다른 명령으로 출력을 리다이렉트할 수 있다. 리다이렉트 파일을 사용하지 않고도 첫 번째 명령의 출력을 두 번째 명령의 입력으로 전송하고 두 명령을 동시에 실행할 수 있다.

 

$ sort  : 입력받은 것들을 정렬하여 출력함

$ uniq  : 정렬된 데이터를 받아 중복 항목 제거

$ grep  : 지정한 문자패턴 가진 라인 찾아 출력

$ pr  : 페이지 단위로 데이터 잘라 출력

$ head  : 앞의 10개 라인 출력

$ tail  : 마지막 10개 라인 출력

$ tr  : 입력된 문자 변경(대/소문자)하거나, 반복, 삭제하여 출력

$ sed  : 스트림 데이터, tr보다 다양한 문자 변경 사용 가능

 

expr  : 정수만 처리

$ expr 10 + 20

$ expr 10 - 30

$ expor 34 / 3

$ expr 34 % 3

$ expor 34 \* 3  : 곱하기할 때 (* )문자는 쉘 메타문자이므로 백슬래시로 표기해주어야 함

$ var1=$(expr $num + 23)

$ echo $var1

$ expr 23 \> 34 

 

$ echo $[ 5 + 1 ]

$ echo $[ 5 - 1 ]

$ echo $[ 5 * 2 }

$ var2=$[5 + 1]

$ echo $var2

 

부동소수점 해법  : bc 계산기 사용

$ bc

$ bc -q

$ echo "scale=3; 34/7" | bc

--> bc로 계산한 결과값을 보여줌. scale=3은 소수점 이하 3자리까지 출력

$ var1=$(echo "scale=3; 34/7" | bc)

$ echo $var1

 

$ var1=10.46

$ var2=43.67

$ var3=33.2

$ var4=71

$ var5=$(bc << EOF

> scale=4

> a1=($var1 = $var2)

> b1=($var3 = $var4)

> a1 + b1

> EOF

> )

$ echo $var5

$ echo $?

--> 바로 전 명령이 정상적으로 종료되었다면 0, 그렇지 않다면 다른 값. 

--> 비정상적인 명령 실행 시 1이 실행..

 

$ a.sh

$ cat > b.sh

var1=10

var2=20

var3=$[$var1 + $var2]

echo "answer is $var3"

exit 5 <-- ???

--> 도중에 종료되었을 때 임의로 설정하여 값을 받을 수 있음

 

$ echo "aaa"

$ echo -n "aaa"  :  마지막에 개행 문자를 출력하지 않음

$ echo "input"; read aa  : read 명령어로 외부 aa변수가 echo를 읽어 입력

$ echo -e "aaa" : 문자열에서 다음 백슬래시로 이스케이프된 문자를 번역(??)

 

$ read var1 var2  : va1과 var2에 동시에 넣을 수 있음. 공백으로 구분

$ read  : 변수없이 입력하면 내장 변수인 $REPLY에 저장됨

 

$ ./test.sh  : 이렇게 말고 test.sh 로 실행하려면?

--> $ PATH=.:$PATH

 

사용자 검색

$ grep xuser /etc/passwd 

$ echo $?

--> 만약 xuser가 있다면 0이 출력됨

 

$ [ 10 -eq 10 ]

$ aa=100

$ [ $aa -eq 10 ]

$ echo $?

 

권한 확인

$ [ -r file1 ]

$ echo $?

 

$ [ -w file1 ]

$ echo $?

 

$ [ -x file1 ]

$ echo $?

 

$ [ -s emp_file ]

$ echo $?

--> 파일은 있지만 용량이 0이면 1

 

$ [ -s emp_file ]

$ echo $?

--> 파일만 있어도 0

 

$ let b=10

$ (( b=100 ))

$ (( b=b+100 ))

$ (( b+=100 ))

$ (( ++b ))

$ ils

sl

 

() : 배열. z=(ab c),echo{z[@]}, 서브 쉘 작성 등

[]  : 대괄호 안의 변수는 $나 리다이렉트할 때 \를 안 붙여도 됨

[[]]  : []와 큰 차이는 없으나 bash 자체에 내장된 기능을 사용하므로 별도 프로세스를 실행하지 않음. 반복이 많은 일을 처리할 때 효과적..?

if [ numeq1aname = "john" ]

if [[ num -eq 1 ]] && [[name = "john" ]] 

위를 아래처럼 바꿀 수 있어 가독성이 향상됨

(())  : 산술 연산 전용 문법으로 숫자만 처리. 변수 인식을 위해 $를 사용하지 않아도 되며, 따옴표를 사용할 수 없음

변수=(값1 값2 값3 ...)  : 배열로 값 지정 가능

반응형

'Memo' 카테고리의 다른 글

하둡에 대한 짧은 생각  (0) 2021.10.29
(작성중) Hadoop 명령어 정리  (0) 2021.10.28
Docker Shell Code 메모  (0) 2021.10.18
NAT와 Bridge 구분  (0) 2021.10.18
Hadoop 설치할 때 이용했던 Docker 명령어 메모  (0) 2021.10.18
admin