쉘스크립트

스크립트에서 그래픽 사용하기

트리스탄1234 2022. 7. 6. 13:17
728x90
반응형

 

스크립트가 모두 text기반이라 사용하는데 좀 불편한 점이 많습니다. 해서 이번 장에서는 스크립트에서 그래픽을 사용하는 방법에 대해 알아 보도록 하겠습니다.

1. 텍스트 메뉴 만들기

그래픽을 스크립트에 사용하기 전에 현재 화면에 디스플레이되어 있는 모든 내용을 지우는편이 사용자 입장에서 깔끔하게 보입니다. 이를 위한 명령이 clear 명령 입니다. 그리고 echo 명령을 이용해 그래픽에 표시될 내용을 정하면 되는데요 기본적으로 echo명령은 출력 가능한 문자들만 보여 줍니다. 다시 말해 -t이나. newline 문자 등은 출력이 되지 않습니다. 이를 화면에 적용하기 위해서는 echo -e옵션을 사용하여 아래와 같이 사용을 하면 됩니다.

echo -e "1.\tDisplay disk space"

그래픽 모드와 같이 사용하는 스크립트 예제를 하나 살펴 보겠습니다.

#! /bin/bash
clear
echo
echo -e "\t\t\tSys Admin Menu\n"
echo -e "\t1. Display disk space"
echo -e "\t2. Display logged on users"
echo -e "\t3. Display memory usage"
echo -e "\t0. Exit menu\n\n"
echo -en "\t\tEnter option:"
read -n 1 option
실행을 시켜 보면
Sys Admin Menu
1. Display disk space
2. Display logged on users
3. Display memory usage
0. Exit menu
Enter option:

그럼 이제는 function을 이용해서 화면을 만들어 보도록 하겠습니다. 우선 위의 메인 디스플레이를 menu라는 finction으로 만들고 나머지 동작을 위해 case 구문을 사용해 코드를 만들어 보겠습니다.

#!/bin/bash
# simple script menu
function diskspace {
clear
df -k
}
function whoseon {
clear
who
}
function memusage {
clear
cat /proc/meminfo
}
function menu {
clear
echo
echo -e "\t\t\tSys Admin Menu\n"
echo -e "\t1. Display disk space"
echo -e "\t2. Display logged on users"
echo -e "\t3. Display memory usage"
echo -e "\t0. Exit program\n\n"
echo -en "\t\tEnter option: "
read -n 1 option
}
while [ 1 ]
do
menu ==> 메인 화면을 표시 하기 위해 menu 함수를 호출
case $option in
0)
break ;;
1)
diskspace ;;
2)
whoseon ;;
3)
memusage ;;
*)
clear
echo "Sorry, wrong selection";;
esac
echo -en "\n\n\t\t\tHit any key to continue"
read -n 1 line ==> 0이 아닌 다른 값을 넣으면 menu를 호출 합니다.
done
clear
실행을 시켜 보면 아래와 같이 메인 메뉴가 나타 나고
Sys Admin Menu
1. Display disk space
2. Display logged on users
3. Display memory usage
0. Exit program
Enter option: 2
입력에 위에 표시된 숫자를 넣으면 코드에서 정의한 함수가 호출 되면서 실행이 됩니다.
hyowon tty7 2021-06-27 06:53 (:0)
Hit any key to continue
아무키나 입력 하며 다시 메인메뉴로 돌아 갑니다.

Select 명령어 사용하기

Select 명령은 하나의 명령어 라인에서 메뉴를 만들 수 있게 해줍니다. 그리고 입력된 값을 자동으로 처리해 주게 합니다. Select 명령어 사용 방법은 아래와 같습니다.

select variabl in list

do

commands

done

select명령은 list에 나열된 모든 문자들을 space로 구분을 합니다. 그리고 이 문자들을 각각 분리하여 표시를 해 줍니다. 아래의 예제를 실행해 봅시다.

#!/bin/bash
# using select in the menu
function diskspace {
clear
df -k
}
function whoseon {
clear
who
}
function memusage {
clear
cat /proc/meminfo
}
PS3="Enter option: "
select option in "Display disk space" "Display logged on users"
"Display memory usage" "Exit program"
do
case $option in
"Exit program")
break ;;
"Display disk space")
diskspace ;;
"Display logged on users")
whoseon ;;
"Display memory usage")
memusage ;;
*)
clear
echo "Sorry, wrong selection";;
esac
done
clear
$
실행을 시켜 보며 단수 echo 문을 사용하여 작성할때 보다 numbering이나 기타 자동적으로 메세제가 표시되는 것을 확인할 수 있습니다.

2. 컬러 추가 하기

대부분의 터미널 emulation 소프트웨어는 ANSI escape code를 인식 합니다. ANSI escape 코드는 화면 디스플레이 형식을 구성 할수 있스빈다. 이 코드는 Control sequence indicator(CSI)로 시작을 합니다. 그리고 ANSI escape code에는 커서의 우치와 화면에서 지워지는 부분을 위한 코드가 있는데, 이를 SGR(Select Graphic Rendition)이라고 부릅니다. sge의 형식은 아래와 같습니다.

CSIn[;k]m

여기서 m은 SGR 코드를 의미를 하고, n과 k는 어느 디스클레이 컨트롤을 이용할지 표시를 해 줍니다.

여기서 디스플레이 control code는 아래와 같이 3가지가 있습니다.

■ Effect control codes

■ Foreground color control codes

■ Background color control codes

[Effect Control code]

위의 테이블은 Effect Control Code값을 보여 줍니다. 이탈리안 폰트를 사용하고 싶으면 CSI3m으로 설정을 하면되고, 이탈리안 폰트와 blink를 사용하고 싶으면 CSI3;5m으로 설정을 하면 됩니다.

반응형

foreground와 background 컬러 cONTROL은 2개의 자릿수를 사용 합니다. foreground는 3으로 시작하는 2자릿수의 코드를 가지고 backgrocund는 4로 시작하는 2자릿수 코드를 사용합니다. 아래으 표는 사용가능한 코드표 입니다.

그래서 만약 foreground의 컬러를 white로 사용하고 싶으면, CSI37m로 사용을 하면 됩니다. background는 CSI47m이렇게 이용을 하시면 됩니다. 만약에 forwground와 background를 동시에 설정하고 싶으면 아래와 같이 설정을 하여 사용을 하면 됩니다.

CSI31;40m

3. Window 사용하기

스크립트를 이용해 메뉴 메뉴를 만들고 컬러를 입혀 보았지만 window 그래픽에 비교하면 아직 많이 부족 합니다. 다행히도 리눈ㄱ스에서는 dialog 패키지를 이용하여 이를 구현할 수 있습니다.

dialog pacakage

아래표는 dialog package에서 사용할 수 있는 widget을 표시 해주고 있습니다. 그리고 사용방법은 아래와 같습니다.

dialog --widget parameters

widget은 아래의 표에서 사용하고 싶은 widget의 이름을 나타내고 parameter는 widget의 size를 지정할 수 있습니다.

그리고 widget의 출력은 아래 2가지로 나타 납니다.

■ Using STDERR

■ Using the exit code status

exit code 상태는 사용자로 부터 선택된 버튼을 결정하는데 사용되게 됩니다. 예를 들어 YesNo widget에서 Yes와 Ok는 exit code를 0로 No와 Cancel은 다른 코드값을 리턴하게 됩니다. 만약에 widget이 데이터를 리턴 하는 경우 dialog 명령어는 STDERR로 데이터를 리턴하고 표준 bash shell 의 redirect를 사용할수 있습니다.

아래는 inputbox의 widget으로 입력 받은 사용자의 나이를 age.txt로 저장을 해주게 됩니다.

dialog --inputbox "Enter your age:" 10 20 2>age.txt

mesgbox widget

스크립트에서 가장많이 사용하는 widget이 mesgbox 입니다. 사용 구문은 아래와 같습니다.

$ dialog --title Testing --msgbox "This is a test" 10 20

title widget으로 mesgbox의 제목을 정할수 있는 --msgbox 다음에 나오는 " This is a test"가 간단하게 msgbox에 표시할 문자를 표시 합니다. 그리고 10 20은 size를 지정해 주는 파라메터 입니다.

yesno widget

yesno widget은 msgbox에 기능을 하나 더 추가한 것이라고 보시면 됩니다. msgbox는 ok 입력 버튼 하나만 표시를 해 주지만 yesno box는 Yes와 No의 2개의 입력 단추를 나타내 줍니다. 사용 구문은 아래와 같습니다.

$ dialog --title "Please answer" --yesno "Is this thing on?" 10 20

사용방법은 msgbox와 동일 하다고 보면 됩니다.

textbox widget

텍스트 박스 widget은 스크롤을 할수 있는 widnow를 제공을 해 줍니다. 사용 방법은 아래와 같습니다.

$ dialog --textbox /etc/passwd 15 45

/etc/passwd 파일의 내용을 텍스트 박스에 15 45의 size로 보여 줍니다.

menu widget

menu widget은 앞장에서 만들어온 코드를 간단히 실행할수 있는 widget 입니다.

사용 방법은 아래와 같습니다.

$dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 4 "Exit" 2> text.txt

메뉴의 title이 Sys Admin Menu이고 높이와 너비는 20 30 size로 그리고 한 화면에 표시할 메뉴수 10을 정의를 하고 그 다음 메뉴 항목은 1번부터 4번까지 그리고 입력 결과를 text.txt파일로 저장이 되게 되는 구문 입니다.

fselect widget

사용자의 입력을 받는경우가 아니라 파일의 위치를 찾고 파일을 첨부하게 할 수 있는 widget 입니다.

사용 방법은 아래와 같습니다.

$ dialog --title "Select a file" --fselect $HOME/ 10 50 2>file.txt

-fselect 다음에 오는 디렉토리를 파일을 찾기 시작하는 위치 입니다.

Dialog 옵션

위에서 설명한 widget을 좀더 자세히 설정하기 위해서 option을 사용을 할 수가 있습니다.

widget과 같이 사용할 수 있는 widget은 아래 표와 같습니다.

스크립트에서 다이아로그 사용하기

스크립트에서 다이아로그 명령을 사용할때에는 아래 2가지에 대해서 주의를 해야 됩니다.

■ Cancel 버튼이나 No 버튼이 있는 경우 exit code

■ 결과물을 정의 하기 위해 STDERR의 리다이렉트

위에서 만들었던 menu code를 dialog를 활용하여 만들어 보도록 하겠 습니다.

#!/bin/bash
# using dialog to create a menu
temp=`mktemp -t test.XXXXXX`
temp2=`mktemp -t test2.XXXXXX`
function diskspace {
df -k > $temp
dialog --textbox $temp 20 60
}
function whoseon {
who > $temp
dialog --textbox $temp 20 50
}
function memusage {
cat /proc/meminfo > $temp
dialog --textbox $temp 20 50
}
while [ 1 ]
do
dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2
"Display users" 3 "Display memory usage" 0 "Exit" 2> $temp2
if [ $? -eq 1 ]
then
break
fi
selection=`cat $temp2`
case $selection in
1)
diskspace ;;
2)
whoseon ;;
3)
memusage ;;
0)
break ;;
*)
dialog --msgbox "Sorry, invalid selection" 10 30
esac
done
rm -f $temp 2> /dev/null
rm -f $temp2 2> /dev/null

이제 사용자의 입력을 그래픽 상에서 선택하게 할 수가 있습니다.

4. 그래픽 사용하기

KDE나 gnome 데스크탑 환경에서는 좀더 파워풀한 X Window 패키지를 사용할 수 있습니다.

kdialog와 zenity가 있는데요 데스크탑 환경에 따라서 사용 방법을 알아 보도록 하겠습니다.

KDE 환경에서 Kdialog widget

KDE환경에서는 기본적으로 Kdialog 포함이 되어 있습니다.

사dialog 명령어와 비슷하게 사용을 하면 됩니다. 명령어 사용 방법은 아래와 같습니다.

사용구문

kdialog display-options window-options arguments

예를 들어 명령을 실행해 보겠습니다.(check list와 radiolist 사용 예제)

kdialog --checklist "Items I need" 1 "Toothbrush" on 2 "Toothpaste" off 3 "Hair brush" on 4 "Deodorant" off 5 "Slippers" off

실행을 해보면 on이라고 설정되어 있는 부분이 활성화 되어 있는것을 볼수 있습니다. 그리고 위의 명령을 실행을 시키면 터미널 세션에서 실행이 되는게 아니고 KDE 환경에서 실행이 되게 됩니다.

그리고 아래는 KDE환경에서 사용가능한 Window Option 표 입니다.

Kdialog 스트립트에서 사용하는 예제를 한번 살펴 보게 습니다. 사용 방법은 diablog 사용법과 동일 합니다.

#!/bin/bash
# using kdialog to create a menu
temp=`mktemp -t temp.XXXXXX`
temp2=`mktemp -t temp2.XXXXXX`
function diskspace {
df -k > $temp
kdialog --textbox $temp 1000 10
}
function whoseon {
who > $temp
kdialog --textbox $temp 500 10
}
function memusage {
cat /proc/meminfo > $temp
kdialog --textbox $temp 300 500
}
while [ 1 ]
do
kdialog --menu "Sys Admin Menu" "1" "Display disk space" "2" "Display
users" "3" "Display memory usage" "0" "Exit" > $temp2
if [ $? -eq 1 ]
then
break
fi
selection=`cat $temp2`
case $selection in
1)
diskspace ;;
2)
whoseon ;;
3)
memusage ;;
0)
break ;;
*)
kdialog --msgbox "Sorry, invalid selection"
esac
done

실행을 시켜 보면 그래픽이 좀더 나아졌다는 느낌이 듭니다.

Display users를 선택을 하면

GNOME 환경에서 그래픽 사용 하기

gnome환경에서는 그래픽을 사용하기 위해 아래 2가지의 package가 지원이 됩니다.

■ gdialog

■ zenity

Zenity 사용하기

아래표는 zenity에서 사용가능한 widget은 아래와 같고 사용 방법은 아래와 같습니다.

$zenity --calendar

날짜를 선택을 하면 STDOUT으로 선택된 값을 돌려 줍니다.

Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

2021년 06월 29일

Zenity를 스크립트에 사용하기

zenity를 스크립트에 사용하는 방법은 Kdialog와는 조금 다름니다 zenity는 kdialog나 dialog에서 사용하는 option값을 변화 시켜 주지 않습니다. kdialog에서 menu를 zenity에서 사용하기 위해서는 아래와 같이 코드를 변경 해야 합니다.

#!/bin/bash
# using zenity to create a menu
temp=`mktemp -t temp.XXXXXX`
temp2=`mktemp -t temp2.XXXXXX`
function diskspace {
df -k > $temp
zenity --text-info --title "Disk space" --filename=$temp
--width 750 --height 10
}
function whoseon {
who > $temp
zenity --text-info --title "Logged in users" --filename=$temp
--width 500 --height 10
}
function memusage {
cat /proc/meminfo > $temp
zenity --text-info --title "Memory usage" --filename=$temp
--width 300 --height 500
}
while [ 1 ]
do
zenity --list --radiolist --title "Sys Admin Menu" --column "Select"
--column "Menu Item" FALSE "Display disk space" FALSE "Display users"
FALSE "Display memory usage" FALSE "Exit" > $temp2
if [ $? -eq 1 ]
then
break
fi
selection=`cat $temp2`
case $selection in
"Display disk space")
diskspace ;;
"Display users")
whoseon ;;
"Display memory usage")
memusage ;;
Exit)
break ;;
*)
zenity --info "Sorry, invalid selection"
esac
done

그럼 이번 포스팅은 여기까지 갈 수록 좀 복잡해지는 느낌이네요.

그럼 오늘도 화이팅.

728x90
반응형

'쉘스크립트' 카테고리의 다른 글

정규 표현식  (2) 2022.07.06
sed와 gawk의소개  (2) 2022.07.06
함수 만들기  (1) 2022.07.06
스크립트 제어  (1) 2022.07.06
데이터 표현하기  (2) 2022.07.06