리눅스 쉘 명령어 메모

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}

--> $aa나 $bb에 값이 설정되지 않았다면 banana를 출력

\$ echo \${bb:=banana}

--> $bb에 값이 설정되지 않았다면 banana를 출력하고 $bb에 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=($a $b $c), echo ${z[@]}, 서브 쉘 작성 등

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

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

if [ $num -eq 1 -a $name = "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