리눅스 쉘 명령어 메모
Memo 2021. 10. 23. 11:33참고할 곳
https://blog.gaerae.com/2015/01/bash-hello-world.html
https://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/
\$ 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 |