리눅스 쉘 명령어 메모
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=(ab c),echo{z[@]}, 서브 쉘 작성 등
[] : 대괄호 안의 변수는 $나 리다이렉트할 때 \를 안 붙여도 됨
[[]] : []와 큰 차이는 없으나 bash 자체에 내장된 기능을 사용하므로 별도 프로세스를 실행하지 않음. 반복이 많은 일을 처리할 때 효과적..?
if [ num−eq1−aname = "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 |