。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

[네이버클라우드] 클라우드 기반의 개발자 과정 7기/리눅스

8일차

quarrrter 2023. 5. 3. 19:53

쉘,, 이란 뭘까 ,,, 

시간 설정

표준 입력 출력 오류

쉘 종료 상태 코드

쉘 인수 세기

awk

 


SHELL

리눅스 쉘(Shell)은 사용자와 리눅스 커널 간의 인터페이스를 제공하는 프로그램으로, 터미널을 통해 입력한 명령어를 해석하여 커널에 전달하고, 커널이 처리한 결과를 다시 터미널로 출력해줍니다.

 

 

현재 쉘 보기 

root@psh:~# echo $SHELL
/bin/bash

root@psh:~# nl /etc/shells   // 현재 사용할 수 있는 쉘 종류
     1  # /etc/shells: valid login shells
     2  /bin/sh
     3  /bin/bash
     4  /usr/bin/bash
     5  /bin/rbash
     6  /usr/bin/rbash
     7  /usr/bin/sh
     8  /bin/dash
     9  /usr/bin/dash
    10  /usr/bin/tmux
    11  /usr/bin/screen

콘쉘 사용

ai ksh // 콘쉘 


root@psh:~/d8# vi a1.sh
  1 #!/bin/bash    // 아래 글은 bin 밑에 bash로 해석하세요 .. 다른 유닉스에서도 해석하려면 bash 대신 sh 들어가야됨
  2 
  3 echo "오늘은 수요일"

  4 d=`date`
  5 d1=$(date)
  6 now=`date +%Y년%m월%d일:%H시:%M분`
  7 echo "오늘은 $d, $d1"
  8 echo " 지금 시간은 : $now "
  9 echo



root@psh:~/d8# a1.sh
a1.sh: 명령을 찾을 수 없습니다
root@psh:~/d8# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

root@psh:~/d8# chmod +x a1.sh     //권한주기 chmod u=x, g=r, o=w
root@psh:~/d8# ll
합계 16
-rw------- 1 root root 12288  5월  3 10:07 .a1.sh.swp
-rwxr-xr-x 1 root root    95  5월  3 10:07 a1.sh*

root@psh:~/d8# ./a1.sh

오늘은 수요일
오늘은 2023. 05. 03. (수) 10:19:57 KST, 2023. 05. 03. (수) 10:19:57 KST
 지금 시간은 : 2023년05월03일:10시:19분



root@psh:~/d8# PATH=$PATH:.  //path에 현재 경로 추가   ./ 안 넣어도 됨 
root@psh:~/d8# a.sh

오늘은 수요일
오늘은 2023. 05. 03. (수) 10:14:13 KST, 2023. 05. 03. (수) 10:14:13 KST

 

달력 & 시간 alias 설정 

root@psh:~/d8# date
2023. 05. 03. (수) 10:16:31 KST
root@psh:~/d8# date +%Y년%m월%d일::%H시:%M분
2023년05월03일::10시:17분

root@psh:~/d8# alias date='date +%Y년%m월%d일:%H시:%M분'
root@psh:~/d8# date
2023년05월03일:10시:18분

//시간 셋팅
root@psh:~# timedatectl set-timezone 'Asia/Seoul'

 

표준 입력, 출력, 에러 

stdin 0 표준입력  키보드
stdout 1 표준출력  모니터 
stderr  2 표준 오류출력 모니터 

 

 

표준 입력: cat < a1  = cat 0 < a1

cat 명령어가 a1 파일을 직접 읽어들이지 않고, 파일에서 데이터를 읽어서 출력합니다.

표준 출력: cal > a2 = cat 1 > a2

표준 오류 출력: dfdfd  2 > dafd a12 : 에러를 a12에 저장하겠다

((  2>/dev/null   : 에러를 dev/null 에 갖다 버리겠다 .. !! )) 

 

종료 상태 코드

root@psh:~# fdafd
fdafd: 명령을 찾을 수 없습니다
root@psh:~# echo $?  //이전 명령의 상태 값 보기
127  // 명령어를 찾을 수 없음 
root@psh:~# date
2023. 05. 03. (수) 11:30:39 KST
root@psh:~# echo $?
0  // 성공
root@psh:~# cd /etdfdafs f
-bash: cd: 인자가 너무 많음
root@psh:~# echo $?
1  // 알수없는 오류 ,일반 오류

명령어 read : 사용자로부터 입력을 받는 명령어/ 사용자가 입력한 값을 변수에 저장하거나, 여러 개의 변수에 동시에 값을 저장 가능

root@psh:~# read a b c
afdaf 40 5.6
root@psh:~# echo $a $b $c
afdaf 40 5.6

root@psh:~# read a b c
fdf adfdf fdfd fdf fdf dfdf
root@psh:~# echo $a $b $c
fdf adfdf fdfd fdf fdf dfdf
root@psh:~# echo $c   // a b 에 값 하나씩 주고 나머지 다 c에 감 
fdfd fdf fdf dfdf


//read와 echo,,

root@psh:~/d8/d80# read -p  "사는 곳은 : "  town; echo "우리집은  $town"
사는 곳은 : 인천시
우리집은  인천시

**-p 옵션 - "사는 곳은 : "이라는 메시지를 출력하고, 사용자로부터 입력받을 값을 변수 town에 저장

 

SEHLL과 C언어에서 파일 이름이 인수로 세어지는가 !? 

 

root@psh:~/d8/d80# vi b.sh
  1 #!/bin/bash
  2
  3 echo " script 이름 : $0 "  //b.sh 스크립트 이름이 $0 변수에 저장됨, 인수로 전달 x 
  4 echo " \$1 : $1 "         //   \이 뒤를 문자 자체로 해석해라  \n : 줄 바꾸기 , 만약 저 자체를 띄우고싶음 \\n
  5 echo " \$2 : $2 "
  6 echo " \$3 : $3 "
  7 echo " \$4 : $4 "
  8 echo " argument 개수 : $# "     //#갯수 세기
  9 echo " 모든 값 출력 : $* "



root@psh:~/d8/d80# b.sh 3 4 55 jk
 script 이름 : ./b.sh          
 $1 : 3
 $2 : 4
 $3 : 55
 $4 : jk
 argument 개수 : 4
 모든 값 출력 : 3 4 55 jk


vi a.c
  1 #include <stdio.h>
  2 int main(int a,char* b[])
  3 {
  4     int i=0;
  5     printf("인수의 개수 = %d \n", a);
  6
  7     for (i=0; i<a; i++)
  8         printf(" \b[%d] ==> %s \n", i, b[i]);
  9         return 0;
 10 }


root@psh:~/d8/d80# a1 aa bb 30 50
인수의 개수 = 5
[0] ==> a1
[1] ==> aa
[2] ==> bb
[3] ==> 30
[4] ==> 50

##리눅스 bash shell과 C 언어에서 스크립트 이름이 전달되는 방식에는 차이가 있습니다.

Bash shell에서는 스크립트 이름이 $0 변수에 저장됩니다. 이 변수를 통해 스크립트 내에서 스크립트 이름을 사용할 수 있습니다. 그러나 스크립트 이름은 명시적으로 인수로 전달되지 않습니다.

반면에 C 언어에서는 프로그램의 이름은 argv[0]에 저장됩니다. C 언어의 main 함수는 프로그램의 시작 지점으로 사용되며, 프로그램이 실행될 때 명령줄에서 전달된 인수들은 argv 배열에 저장됩니다. argv[0]에는 프로그램 이름이 저장되며, argv[1]부터는 명령줄 인수가 차례대로 저장됩니다.

따라서 C 언어에서는 프로그램 이름이 인수로 세어지는 것입니다. 이것은 프로그램이 다른 이름으로 실행되는 경우를 대비하여 유용합니다.

 

 

 

**ssh root login 허용

/etc/ssh #vi sshd_config
33 PermitRootLogin yes

root@psh:/etc/ssh# systemctl restart sshd

==> 루트로 로긴 가능 !

 

지역변수를 환경변수에 이사시키기 

a=300
그냥 만들면 지역변수 set에 있지만 
export aa  //환경변수에 이사시키기 
env | grep aa
set | grep aa

 

awk

  • 텍스트 데이터를 처리하기 위한 유틸리티 프로그램
  • 컬럼과 로우로 이루어진 데이터를 가지고 작업할 때 유용
  • 기본적으로 파일로부터 데이터를 읽어와서 분석, 이때 분석하고 싶은 부분을 기준으로 필드를 지정해줄 수 있습니다. (기본적으로 공백을 기준으로 필드를 분리)

 

<공백으로 구분>
root@psh:~/d8# nl k1 k2 k3
     1  이순실
     2  강감찬
     3  장영실
     4  500
     5  300
     6  700
     7  34
     8  23
     9  47
root@psh:~/d8# paste k1 k2 k3
이순실  500     34
강감찬  300     23
장영실  700     47
root@psh:~/d8# paste k1 k2 k3 > kk
root@psh:~/d8# nl kk
     1  이순실  500     34
     2  강감찬  300     23
     3  장영실  700     47


root@psh:~/d8# awk '{print $1, $2, $3}' kk
이순실 500 34
강감찬 300 23
장영실 700 47

<<갑분 db>>
root@psh:~/d8# sqlite3
sqlite> create table yy(name, asset, age);
sqlite> .import kk yy
sqlite> .head on
sqlite> .mode col
sqlite> select * from yy;
name  asset  age
----  -----  ---
이순실   500    34
강감찬   300    23
장영실   700    47

.q

<파일크기로 구분>

root@psh:~/d8# df -h
파일 시스템     크기  사용  가용 사용% 마운트위치
tmpfs           198M  1.2M  197M    1% /run
/dev/sda4        12G  4.3G  6.8G   39% /
tmpfs           988M     0  988M    0% /dev/shm
tmpfs           5.0M     0  5.0M    0% /run/lock
/dev/sda6       9.8G   24K  9.3G    1% /data
/dev/sda2       974M  130M  777M   15% /boot
/dev/sda5       4.9G  352K  4.6G    1% /home
tmpfs           198M  4.0K  198M    1% /run/user/1000
tmpfs           198M  4.0K  198M    1% /run/user/0
tmpfs           198M  4.0K  198M    1% /run/user/1010



root@psh:~/d8# \df | awk '$4 > 800000'
파일 시스템     1K-블록    사용    가용 사용% 마운트위치
/dev/sda4      12278920 4507788 7125604   39% /
tmpfs           1011600       0 1011600    0% /dev/shm
/dev/sda6      10215700      24 9675160    1% /data
/dev/sda5       5074592     352 4795712    1% /home


root@psh:~/d8# find / -size +100M   //100메가 넘는 파일만 찾아라 
/proc/kcore
root@psh:~/d8# find / -size +100M 2>/dev/null

root@psh:~/d8# ll /etc | awk print '$5'

스크립트로 초기 파일 설정 ! 

 

init_1 :  완전 초기 상태 (설치 후 아무것도 안함)
init_2 :  설치 필수 패키지 설치, 기본 설정

▶   vi  init_1.sh


timedatectl set-timezone 'Asia/Seoul'
now=`date +%Y년%m월%d일::%H시%M분`

echo $now >> ~/out.txt 
apt list  --installed  | wc -l >>  ~/out.txt
echo $now >> ~/out.txt 

apt-get  -y  install  gcc g++ default-jdk mysql-server sqlite3 tomcat9 apache2

apt-get  -y install  php php-curl php-gd php-intl php-mbstring php-soap php-xml \
                      php-xmlrpc php-zip php-mysql 

apt list  --installed  | wc -l >>  ~/out.txt
echo $now >> ~/out.txt 


chmod +x  init_1.sh