Linux/Bash shell

[Linux-vim] vim에디터 사용하기 6 - tar, yad ( list, CRUD model GUI 구현)

걍작 2022. 3. 16. 02:23

# 정리 

** +=로 배열을 연결하여 데이터를 넣을 수 있다. 
** 쉘 문법에서는 함수의 콜이 함수 정의보다 선행할 수 없다.


# tar - 아카이브와 압축
//리눅스에서는 윈도우와 달리 "묶기(아카이브)"와 "압축"이 별도로 고려된다.
//압축없이 하나의 파일로 묶는 것을 "아카이브"라고 한다.
 - (tar, tar.gz, tar.bz ..) 형태로 묶는 형식과 압축 형식에 대한 확장자 별도로 온다.
 - .tar : 여러 파일 혹은 디렉토리를 하나의 파일로 묶는 확장자는 tar이다.
 - .gz : gzip이 대표적이나, 압축형식은 옵션에 따라 여러 종류가 있다. (ex.gzip, gunzip, bzip, bunzip..)
//$tar [옵션] [파일명] (압축시 - 선택 범위) 형태로 실행한다.
< v와 f는 무조건 붙인다고 생각하자. >
 - $tar cvf (생성파일명) (대상 선택 조건) = tar파일 생성
 - $tar xvf (생성파일명) = tar 파일 풀기
 - $tar zcvf (생성파일명) (대상 선택 조건) = tar파일 생성과 gzip압축
 - $tar zxvf (생성파일명) = tar.gz 파일 풀기
 - $tar rvf (생성파일명) (대상 선택 조건) = 기존 tar파일에 다른파일 추가로 묶기
 - $tar tvf (생성파일명) = tar파일에 묶인 파일 확인
//옵션 상세 설명
-c : 지정된 파일이나 디렉터리를 묶어 하나의 tar파일 생성 (손으로 쥐는 모양으로 기억하자)
-x : 생성된 tar파일 풀기 (묶인 것을 잘라내는 가위 모양으로 기억하자)
-v : 명령 실행 시, 작업되어지는 파일명을 보여준다.
-f : 생성될 tar파일에 대한 이름 지정 ( **이름이 있어야 압축 풀 때도 편리하게 풀 수 있다.)
-t : tar 파일에 묶여있는 파일의 목록 출력
-z : gzip 관련 옵션으로 tar.gz 파일 생성에 사용
-j : bzip2 관련 옵션으로 tar.bz2 파일 생성에 사용
-J : xz 관련 옵션으로 tar.xz 파일 생성에 사용


# yad  - 앞 글에 이어서 추가 공부
( 4.list : 배열 데이터 표시 )
//배열 혹은 배열로 표현할 수 있는 형태의 데이터가 있어야한다.
 - ex. ( kim|admin|1234|2202-03-14 lee|admin|5678|2202-03-13 ... )
// (--list옵션) 배열 데이터를 표로 표현할 수 있다. 
 - 표에 나온 한 덩어리의 데이터(1행  = 리스트 1줄)씩 선택할 수 있게된다.
 - 한 덩어리의 데이터 수와 컬럼 수가 맞지 않으면 표가 꼬이므로, 컬럼 작성에 주의한다. 
 - 더블클릭해도 값을 받아온다.("OK"버튼과 동일 효과)

( 5.CRUD 1 : selectAll GUI 구현 실습 ) 
** yad 옵션 안내 : https://www.systutorials.com/docs/linux/man/1-yad/
//yad 추가 옵션
 - -- width 650 -- height 300  : 창 크기 650 * 300으로 조절 
 - --image=random.png : random.png 이미지 추가 (동일 이름의 이미지가 없는 경우, 임의의 기본 이미지가 삽입됨)
 - --text="<span color='Blue' font='Monospace 30'>selectAll</span>" : 글자 삽입 및 폰트 지정
 - --text-align=center : 삽입 글자 가운데 정렬
 - --button=update --button=insert --button=delete  : 버튼 추가 (좌측부터 0 ,1, 2, .. 순으로 result 값이 할당된다)

( 6.CRUD 2 : insert/update/delete GUI 구현 실습 ) 
//Delete page - 아래 주석 2줄을 사용하면 if 조건문에는 깔끔하게 YES를 쓸 수 있다(예문 참조).

 

 

 

# tar - 아카이브와 압축

//리눅스에서는 윈도우와 달리 "묶기(아카이브)"와 "압축"이 별도로 고려된다.

//압축없이 하나의 파일로 묶는 것을 "아카이브"라고 한다.

 - (tar, tar.gz, tar.bz ..) 형태로 묶는 형식과 압축 형식에 대한 확장자 별도로 온다.

 - .tar : 여러 파일 혹은 디렉토리를 하나의 파일로 묶는 확장자는 tar이다.

 - .gz : gzip이 대표적이나, 압축형식은 옵션에 따라 여러 종류가 있다. (ex.gzip, gunzip, bzip, bunzip..)

//$tar [옵션] [파일명] (압축시 - 선택 범위) 형태로 실행한다.

< v와 f는 무조건 붙인다고 생각하자. >

 - $tar cvf (생성파일명) (대상 선택 조건) = tar파일 생성

 - $tar xvf (생성파일명) = tar 파일 풀기

 - $tar zcvf (생성파일명) (대상 선택 조건) = tar파일 생성과 gzip압축

 - $tar zxvf (생성파일명) = tar.gz 파일 풀기

 - $tar rvf (생성파일명) (대상 선택 조건) = 기존 tar파일에 다른파일 추가로 묶기

 - $tar tvf (생성파일명) = tar파일에 묶인 파일 확인

//옵션 상세 설명

-c : 지정된 파일이나 디렉터리를 묶어 하나의 tar파일 생성 (손으로 쥐는 모양으로 기억하자)

-x : 생성된 tar파일 풀기 (묶인 것을 잘라내는 가위 모양으로 기억하자)

-v : 명령 실행 시, 작업되어지는 파일명을 보여준다.

-f : 생성될 tar파일에 대한 이름 지정 ( **이름이 있어야 압축 풀 때도 편리하게 풀 수 있다.)

-t : tar 파일에 묶여있는 파일의 목록 출력

-z : gzip 관련 옵션으로 tar.gz 파일 생성에 사용

-j : bzip2 관련 옵션으로 tar.bz2 파일 생성에 사용

-J : xz 관련 옵션으로 tar.xz 파일 생성에 사용

 

//실습 해보기 - tar 파일 만들기 > 대상 파일 삭제하기 > 압축 풀기 

pi@raspberry:~/practice/temp $ tar -cvf tarexample.tar sh*

pi@raspberry:~/practice/temp $ tar -xvf tarexample.tar
pi@raspberry:~/practice/temp $ tar -zcvf tarexample.tar.gz sh*
pi@raspberry:~/practice/temp $ tar zxvf tarexample.tar.gz

(좌/우) v옵션 적용 / 미적용 - 파일 리스트의 유무를 확인할 수 있다.

 

 


 

** +=로 배열을 연결하여 데이터를 넣을 수 있다. 

 

# yad - 4.list : 배열 데이터 표시 

//배열 혹은 배열로 표현할 수 있는 형태의 데이터가 있어야한다.

 - ex. ( kim|admin|1234|2202-03-14 lee|admin|5678|2202-03-13 ... )

//--list --column=컬럼명 ~ "${배열변수명[@]}" 형태로 사용된다.

 - (--list옵션) 배열 데이터를 표로 표현할 수 있다. 

 - 표에 나온 한 덩어리의 데이터(1행  = 리스트 1줄)씩 선택할 수 있게된다.

 - 한 덩어리의 데이터 수와 컬럼 수가 맞지 않으면 표가 꼬이므로, 컬럼 작성에 주의한다. 

 - 더블클릭해도 값을 받아온다.("OK"버튼과 동일 효과)

 

 

-------------------------------------------

 

# yad - 5.CRUD 1 : selectAll (DB 연동 대비 GUI 구현 실습) 

 - IFS="| " read -ra rows <<< $vos : 텍스트 값 배열로 변경

 - 함수 selectAll() 에 할당

 ** 쉘 문법에서는 함수의 콜이 함수 정의보다 선행할 수 없다.

//yad 추가 옵션

 - -- width 650 -- height 300  : 창 크기 650 * 300으로 조절 

 - --image=random.png : random.png 이미지 추가 (동일 이름의 이미지가 없는 경우, 임의의 기본 이미지가 삽입됨)

 - --text="<span color='Blue' font='Monospace 30'>selectAll</span>" : 글자 삽입 및 폰트 지정

 - --text-align=center : 삽입 글자 가운데 정렬

 - --button=update --button=insert --button=delete  : 버튼 추가 (좌측부터 0 ,1, 2, .. 순으로 result 값이 할당된다)

https://www.systutorials.com/docs/linux/man/1-yad/

#!/bin/bash
clear
pwd
echo $0

echo "----------------------"

# 더미 데이터 준비
   #score=(1 yang 90 91 92)
   #score+=(2 kim1 81 82 83)
   #score+=(3 kim2 81 82 83)
   #score+=(4 kim3 81 82 83)
   #score+=(5 kim4 81 82 83)
   #score+=(6 kim5 81 82 83)
   vos="1|kim1|99|88|77 "
   vos+="2|kim2|99|88|77 "
   vos+="3|kim2|99|88|77 "
   vos+="4|kim2|99|88|77 "
   vos+="5|kim2|99|88|77 "
   vos+="6|kim2|99|88|77 "
   vos+="7|kim2|99|88|77 "
   vos+="8|kim2|99|88|77 "
   echo "vos.length:"${#vos}
   IFS="| " read -ra rows <<< $vos

   echo ${rows[@]}
   echo "rows.length:"${#rows[@]}

   #echo ${score[@]}


# GUI 구현 구문 selectAll 함수에 할당
selectAll(){

   row=$(yad --width 650 --height 300 --title "List" --list --image=random.png --text="<span color='Blue' font='Monospace 30'>selectAll</span>" --text-align=center --button=update --button=insert --button=delete  --column=NUM  --column=NAME --column=KOR --column=ENG --column=MATH "${rows[@]}") result=$?


   if ((result==0));then
      echo "Go update"
   elif ((result==1));then
      echo "Go insert"
   elif ((result==2));then
      echo "Go delete"
   fi

}
#end selectAll 
selectAll


exit 0

 

 

 

-------------------------------------------

 

# yad - 6.CRUD 2 : insert/update/delete (DB 연동 대비 GUI 구현 실습) 

// 각 페이지를 실행하면 터미널로 데이터는 넘어오지만 , 파일 실행 시마다 SelectAll에서 매번 데이터를 새로 선언하기 때문에 데이터의 변동은 없음.

//Delete page - 아래 주석 2줄을 사용하면 if 조건문에는 깔끔하게 YES를 쓸 수 있다.
(데이터가 넘어올 떄 "|YES"형태로 넘어오기 떄문에 이렇게 된 것임)
  - #cb=$(echo $delete_form | awk 'BEGIN {FS="|"} {print $1}')
  - #if [ $cb = 'YES' ];then

#!/bin/bash
clear
pwd
echo $0

echo "----------------------"
################## insert page  #################
insert(){
   echo
   echo "insert()..."

   form=$(yad --width 300 --title "Insert Form" --form --field "name" --field "kor" --field "eng" --field "math" "kim" "99" "88" "77") result=$?

   echo $form
   echo $result

   if ((result==0));then
      echo "OK"
      name=$(echo $form | awk 'BEGIN {FS="|"} {print $1}')
      kor=$(echo $form | awk 'BEGIN {FS="|"} {print $2}')
      eng=$(echo $form | awk 'BEGIN {FS="|"} {print $3}')
      math=$(echo $form | awk 'BEGIN {FS="|"} {print $4}')
      printf "%s,%d,%d,%d\n" $name $kor $eng $math  
   else
      echo "Cancel"
   fi
}


################### update page ###################
update(){
   echo
   echo "update()..." $1 $2 $3 $4 $5
   form=$(yad --width 300 --title "Update Form" --form --field "num" --field "name" --field "kor" --field "eng" --field "math" "$1" "$2" "$3" "$4" "$5") result=$?

   echo $form
   echo $result

   if ((result==0));then
      echo "OK"
      num=$(echo $form | awk 'BEGIN {FS="|"} {print $1}')
      name=$(echo $form | awk 'BEGIN {FS="|"} {print $2}')
      kor=$(echo $form | awk 'BEGIN {FS="|"} {print $3}')
      eng=$(echo $form | awk 'BEGIN {FS="|"} {print $4}')
      math=$(echo $form | awk 'BEGIN {FS="|"} {print $5}')
      printf "%d,%s,%d,%d,%d\n" $num $name $kor $eng $math  
   else
      echo "Cancel"
   fi
}



#################### delete page ###################
delete(){
   echo
   echo "delete()..." $1 $2
   delete_form=$(yad --width 300 --title "DELETE" --text="$1 $2 DeleteOK???" --form --field "Agree?:CB" "YES!NO") result_delete=$?
   if ((result_delete==0));then
      cb=$(echo $delete_form)
      echo $cb

#아래 주석 2줄을 사용하면 if 조건문에는 깔끔하게 YES를 쓸 수 있다.
#데이터가 넘어올 떄 "|YES"형태로 넘어오기 떄문에 이렇게 된 것임.
      #cb=$(echo $delete_form | awk 'BEGIN {FS="|"} {print $1}')
      #if [ $cb = 'YES' ];then
      if [ $cb = 'YES|' ];then
         echo "Delete OK..."
      else
         echo "Not Agree..."   
      fi
   fi
}


################### selectAll page ################
selectAll(){
   vos="1|kim1|99|88|77 "
   vos+="2|kim2|99|88|77 "
   vos+="3|kim2|99|88|77 "
   vos+="4|kim2|99|88|77 "
   vos+="5|kim2|99|88|77 "
   vos+="6|kim2|99|88|77 "
   vos+="7|kim2|99|88|77 "
   vos+="8|kim2|99|88|77 "
   echo "vos.length:"${#vos}
   IFS="| " read -ra rows <<< $vos

   echo ${rows[@]}
   echo "rows.length:"${#rows[@]}


   row=$(yad --width 650 --height 300 --title "List" --list --image=random.png --text="<span color='Blue' font='Monospace 30'>selectAll</span>" --text-align=center --button=update --button=insert --button=delete  --column=NUM  --column=NAME --column=KOR --column=ENG --column=MATH "${rows[@]}") result=$?

   if ((result==0));then
      echo "OK" "Go update"
      echo $row
      num=$(echo $row | awk 'BEGIN {FS="|"} {print $1}')
      name=$(echo $row | awk 'BEGIN {FS="|"} {print $2}')
      kor=$(echo $row | awk 'BEGIN {FS="|"} {print $3}')
      eng=$(echo $row | awk 'BEGIN {FS="|"} {print $4}')
      math=$(echo $row | awk 'BEGIN {FS="|"} {print $5}')
      printf "%d %s %d %d %d" $num $name $kor $eng $math 
      echo
      echo "----------------------"
      update $num $name $kor $eng $math
   
   elif ((result==1));then
      echo "Go insert"
      insert
   elif ((result==2));then
      echo "Go delete"
      echo $row
      num=$(echo $row | awk 'BEGIN {FS="|"} {print $1}')
      name=$(echo $row | awk 'BEGIN {FS="|"} {print $2}')
      delete $num $name
   fi
}
#end selectAll 
selectAll


exit 0