posted by 귀염둥이채원 2021. 4. 23. 01:15

expect는 다른 응용 어플리케이션과 상호대화(interactive)하는 프로그램을 만들기 위해 만들어진 프로그램이다.
expect를 이용하면 다른 어플리케이션과 상호대화를 할수 있게 됨으로 자동화된 프로그램을 만들수가 있다.

ssh 접속

#!/bin/sh
USER=testuser
IP=192.168.10.2
PW=testpw
expect <<EOF
set timeout 3
spawn ssh -o StrictHostKeyChecking=no $USER@$IP "hostname"
expect "password:"
    send "$PW\r"
expect eof
EOF

hue 신규 계정 생성

#!/bin/bash

sudo yum install -y expect

expect <<EOF
spawn /usr/lib/hue/build/env/bin/hue createsuperuser
expect "Username (leave blank to use 'hadoop'):" {send "hue\r"}
expect "Email address:" {send "hue@email.com\r"}
expect "Password" {send "Huereco1!\r"}
expect "Password (again)" {send "Huereco1!\r"}
expect eof
EOF

참고사이트

https://zetawiki.com/wiki/Bash_%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90_expect_%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EB%84%A3%EA%B8%B0
https://must-thanks.tistory.com/156
https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_expect
posted by 귀염둥이채원 2021. 4. 23. 00:51

IFS는 Internal Field Separator의 약자로 외부프로그램을 실행할 때 입력되는 문자열을 나눌 때 기준이 되는 문자를 정의하는 변수이다.
bash의 내부 필드 구분자(internal field separator)가 공백/탭/줄바꿈이다.
구분자는 IFS 변수에 설정되어 있다.

PROGRAMMING="
java programming
python programming
c programming
"

echo "-------------------------"
for p in $PROGRAMMING; do
echo $p
done

# IFS를 줄바꿈(newline)로 변경
echo "-------------------------"
OLD_IFS="$IFS"
IFS=$'\n'
for p in $PROGRAMMING; do
echo $p
done

IFS="$OLD_IFS"
$ bash test.sh
-------------------------
java
programming
python
programming
c
programming
-------------------------
java programming
python programming
c programming

# 참고사이트
https://m31phy.tistory.com/11
https://webterror.net/?p=1716
https://wooono.tistory.com/186

posted by 귀염둥이채원 2021. 4. 22. 19:44

시작날짜, 종료날짜를 입력해서 매주 일요일, 화요일만 수행하는 스크립트 샘플입니다.

 

CLUSTER_ID="5FFZMTA6C"
BATCH_START_DATE="20210228"
BATCH_END_DATE="20210420"

while true; do
  if [ $BATCH_START_DATE -gt $BATCH_END_DATE ]; then
      exit 0
  fi

  day_of_week=$(date -d "${BATCH_START_DATE}" "+%A")
  if [ $day_of_week == "Sunday" ] || [ $day_of_week == "Tuesday" ]; then
    DISP_START_DATE=$(date -d "${BATCH_START_DATE} +1days" "+%Y%m%d")
    DISP_END_DATE=$(date -d "${BATCH_START_DATE} +7days" "+%Y%m%d")
    echo "BATCH: $BATCH_START_DATE"
    echo "./backfill.sh $_CLUSTER_ID stat $DISP_START_DATE $DISP_END_DATE;"
  fi

  sleep 0.1
  BATCH_START_DATE=$(date -d "${BATCH_START_DATE} +1days" "+%Y%m%d")
done

 

$ bash test7.sh | grep backfill
./backfill.sh  stat 20210301 20210307;
./backfill.sh  stat 20210303 20210309;
./backfill.sh  stat 20210308 20210314;
./backfill.sh  stat 20210310 20210316;
./backfill.sh  stat 20210315 20210321;
./backfill.sh  stat 20210317 20210323;
./backfill.sh  stat 20210322 20210328;
./backfill.sh  stat 20210324 20210330;
./backfill.sh  stat 20210329 20210404;
./backfill.sh  stat 20210331 20210406;
./backfill.sh  stat 20210405 20210411;
./backfill.sh  stat 20210407 20210413;
./backfill.sh  stat 20210412 20210418;
./backfill.sh  stat 20210414 20210420;
./backfill.sh  stat 20210419 20210425;
./backfill.sh  stat 20210421 20210427;​
posted by 귀염둥이채원 2021. 4. 15. 18:51

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

# 디버깅 - set 옵션들 (-e, -u, -x)

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

set은 쉘의 옵션을 설정하는 명령어이다.

-e, -u 옵션을 설정하면 스크립트에서 문제가 발생한것을 찾을수 있다.

* -e: 쉘 스크립트 실행 중에 0이 아닌 값으로 exit을 한 명령이 있으면 나머지 스크립트를 실행하지 않은 채 exit한다.

* -u: 정의되지 않은 변수(undefined)를 참조하면 에러를 출력하며 바로 exit한다.

* -x: 쉘 스크립트가 실행하는 모든 명령을 화면에 출력한다. 디버깅에 유용하다.

 

# 쉘스크립트의 도입부에 다음과 같이 적으면 된다.

set -e -u -x

 

# bash xxx.sh 실행시 옵션 적용

bash -x xxx.sh

bash -eux xxx.sh

 

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

# example1: 스크립트내에서 -e, -u, -x 설정

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

#!/bin/bash

set -e -u -x



NUM=100

echo $NUM



TIME=`date`

echo $TIME



echo $UNDIFIED
# output

$ bash test.sh

+ NUM=100

+ echo 100

100

++ date

+ TIME='2021년 4월 10일 토요일 03시 19분 28초 KST'

2021년 4월 10일 토요일 03시 19분 28초 KST

test.sh: line 9: UNDIFIED: unbound variable

 

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

# example2: 스크립트 실행시 -e 옵션 설정

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

#!/bin/bash

echo $UNDIFIED



NUM=100

echo $NUM



TIME=`date`

echo $TIME
# output

$ bash -e test.sh



100

2021년 4월 10일 토요일 03시 21분 42초 KST

 

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

# 참고사이트

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

https://blog.kkeun.net/computer/2016-08-24-bash-good

https://118k.tistory.com/201

https://frankler.tistory.com/59

 

posted by 귀염둥이채원 2021. 4. 15. 17:22

#!/bin/bash
# -- ABOUT THIS PROGRAM: ------------------------------------------------------
#
# Author:       fang
# Version:      1.0.0
# Description:  description goes here
#
# ------------------------------------------------------------------------------
# | VARIABLES                                                                  |
# ------------------------------------------------------------------------------
VERSION="1.0.0"

# ------------------------------------------------------------------------------
# | UTILS                                                                      |
# ------------------------------------------------------------------------------
log_dbg() {
    printf "$(tput setaf 3)→ %s$(tput sgr0)\n" "$@"
}

log_svc() {
    printf "$(tput setaf 76)✔ %s$(tput sgr0)\n" "$@"
}

log_err() {
    printf "$(tput setaf 1)✖ %s$(tput sgr0)\n" "$@"
}

# ------------------------------------------------------------------------------
# | MAIN FUNCTIONS                                                             |
# ------------------------------------------------------------------------------
usage() {
    cat <<EOF
------------------------------------------------------------------------------
| DESCRIPTION
------------------------------------------------------------------------------
Usage: $0 [options]
Example: $0

Options:
    -h, --help      output program instructions
    -v, --version   output program version

EOF
}

version() {
    echo "$0: v$VERSION"
}

run() {
    # your code goes here
    log_dbg "log_dbg"
    log_svc "log_svc"
    log_err "log_err"
}

# ------------------------------------------------------------------------------
# | INITIALIZE PROGRAM                                                         |
# ------------------------------------------------------------------------------
main() {
    if [[ "${1}" == "-h" || "${1}" == "--help" ]]; then
        usage ${1}
        exit 1
    elif [[ "${1}" == "-v" || "${1}" == "--version" ]]; then
        version ${1}
        exit 1
    else
        run
    fi
}

# Initialize
main $*

posted by 귀염둥이채원 2021. 4. 15. 13:35

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

# trap example

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

#!/bin/bash

# bash trap command

trap bashtrap INT

 

# bash clear screen command

clear

 

# bash trap function is executed when CTRL-C is pressed:

# bash prints message => Executing bash trap subrutine !

bashtrap() {

echo "CTRL+C Detected !...executing bash trap !"

}

 

# for loop from 1/10 to 10/10

for a in $(seq 1 10); do

echo "$a/10 to Exit."

sleep 1

done

echo "Exit Bash Trap Example!!!"

 

# output1

$ bash test.sh

1/10 to Exit.

2/10 to Exit.

3/10 to Exit.

4/10 to Exit.

5/10 to Exit.

6/10 to Exit.

7/10 to Exit.

8/10 to Exit.

9/10 to Exit.

10/10 to Exit.

Exit Bash Trap Example!!!

 

# output2

$ bash test.sh

1/10 to Exit.

2/10 to Exit.

^CCTRL+C Detected !...executing bash trap !

3/10 to Exit.

^CCTRL+C Detected !...executing bash trap !

4/10 to Exit.

^CCTRL+C Detected !...executing bash trap !

5/10 to Exit.

^CCTRL+C Detected !...executing bash trap !

6/10 to Exit.

7/10 to Exit.

8/10 to Exit.

9/10 to Exit.

^CCTRL+C Detected !...executing bash trap !

10/10 to Exit.

Exit Bash Trap Example!!!

 

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

[Shell Script] 디버깅  (0) 2021.04.15
[Shell Script] template source code  (0) 2021.04.15
[Shell Script] 함수(function)  (0) 2021.04.15
[Shell Script] 반복문(while)  (0) 2021.04.15
[Shell Script] 반복문(for)  (0) 2021.04.15
posted by 귀염둥이채원 2021. 4. 15. 12:38

 

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

# 함수(Function)

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

* function는 생략해도 된다.

* 함수명을 쓰면 함수가 호출이 된다.

* 호출 코드가 함수 코드보다 반드시 뒤에 있어야 된다.

- 함수 코드 보다 앞에서 호출 오류가 발생한다.

 

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

# 함수 예시

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

#!/bin/bash

string_test1() {

echo "string test1"

}

 

function string_test2() {

echo "string test2"

echo -n "인자값: ${@}"

}

 

string_test1

string_test2

 

# 함수에 인자값 전달하기(공백으로 띄워서 2개의 인자값을 넘김)

string_test2 "hello" "world"

 

# output

$ bash test.sh

string test1

string test2

인자값: string test2

인자값: hello world

 

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

# example

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

#!/bin/bash

# BASH FUNCTIONS CAN BE DECLARED IN ANY ORDER

function function_B {

echo Function B.

}

function function_A {

echo $1

}

function function_D {

echo Function D.

}

function function_C {

echo $1

}

# FUNCTION CALLS

# Pass parameter to function A

function_A "Function A."

function_B

# Pass parameter to function C

function_C "Function C."

function_D

 

# output

$ bash test.sh

Function A.

Function B.

Function C.

Function D.

 

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

# 문자열을 반환하는 방법 - 전역변수 사용

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

* 전역 변수를 사용하여 문자열 값을 반환

* 함수를 호출 한 후 전역 변수의 값이 변경



#!/bin/bash

function F1() {

retval='I like programming'

}

 

retval='I hate programming'

echo $retval

F1

echo $retval

 

# output

$ bash test.sh

I hate programming

I like programming

 

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

# 문자열을 반환하는 방법 - 함수 명령 사용

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

#!/bin/bash

function F2() {

local retval='Using BASH Function'

echo "$retval"

}

 

getval=$(F2)

echo $getval

 

# output

$ bash test.sh

Using BASH Function

 

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

# 문자열을 반환하는 방법 - 변수 사용

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

#!/bin/bash

function F3() {

local arg1=$1

 

if [[ $arg1 != "" ]]; then

retval="BASH function with variable"

else

echo "No Argument"

fi

}

 

getval1="Bash Function"

F3 $getval1

echo $retval

 

getval2=$(F3)

echo $getval2

 

# output

$ bash test.sh hello

BASH function with variable

No Argument

 

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

# 문자열을 반환하는 방법 - Return 문 사용

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

#!/bin/bash

function F4() {

echo 'Bash Return Statement'

return 35

}

 

F4

echo "Return value of the function is $?"

 

# output

$ bash test.sh hello

Bash Return Statement

Return value of the function is 35

 

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

# 참고사이트

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

https://devhints.io/bash

https://blog.gaerae.com/2015/01/bash-hello-world.html

posted by 귀염둥이채원 2021. 4. 15. 10:25

 

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

# Syntax of while loop:

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

while [ condition ]; do

commands

done

 

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

# 고정 횟수만큼 반복

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

#!/bin/bash

n=1

while [ $n -le 5 ]; do

echo "Running $n time"

((n++))

done

 

# output

$ bash test.sh

Running 1 time

Running 2 time

Running 3 time

Running 4 time

Running 5 time

 

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

# while에서 break 사용

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

#!/bin/bash

n=1

while [ $n -le 10 ]; do

if [ $n == 6 ]; then

echo "terminated"

break

fi

echo "Position: $n"

((n++))

done

 

# output

$ bash test.sh

Position: 1

Position: 2

Position: 3

Position: 4

Position: 5

terminated

 

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

# while에서 continue 사용

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

#!/bin/bash

n=0

while [ $n -le 5 ]; do

((n++))

 

if [ $n == 3 ]; then

continue

fi

echo "Position: $n"

 

done

 

# output

$ bash test.sh

Position: 1

Position: 2

Position: 4

Position: 5

Position: 6

 

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

# 무한루프

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

#!/bin/bash

n=1

while :; do

printf "The current value of n=$n\n"

if [ $n == 3 ]; then

echo "good"

elif [ $n == 5 ]; then

echo "bad"

elif [ $n == 7 ]; then

echo "ugly"

elif [ $n == 10 ]; then

exit 0

fi

((n++))

done

 

# output

$ bash test.sh

The current value of n=1

The current value of n=2

The current value of n=3

good

The current value of n=4

The current value of n=5

bad

The current value of n=6

The current value of n=7

ugly

The current value of n=8

The current value of n=9

The current value of n=10

 

posted by 귀염둥이채원 2021. 4. 15. 09:43

 

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

# Syntax of for loop:

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

for variable_name in lists; do

commands

done

 

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

# 정적 값 읽기

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

#!/bin/bash

 

for color in Blue Green Pink White Red; do

echo "Color = $color"

done

 

# output

$ bash test.sh

Color = Blue

Color = Green

Color = Pink

Color = White

Color = Red

 

for i in 1 2 3 4 5; do

echo "Welcome $i times"

done

 

# output

$ bash test.sh

Welcome 1 times

Welcome 2 times

Welcome 3 times

Welcome 4 times

Welcome 5 times

 

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

# 배열 변수 읽기

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

#!/bin/bash

ColorList=("Blue Green Pink White Red")

for color in $ColorList; do

if [ $color == 'Pink' ]; then

echo "My favorite color is $color"

fi

done

 

# output

$ bash test.sh

My favorite color is Pink

 

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

# 명령 줄 인수 읽기

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

#!/bin/bash

for myval in $*; do

echo "Argument: $myval"

done

 

# output

$ bash test.sh hello world shell

Argument: hello

Argument: world

Argument: shell

 

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

# 홀수 및 짝수 찾기

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

#!/bin/bash

for ((n = 1; n <= 5; n++)); do

if (($n % 2 == 0)); then

echo "$n is even"

else

echo "$n is odd"

fi

done

 

# output

$ bash test.sh

1 is odd

2 is even

3 is odd

4 is even

5 is odd

 

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

# 구구단 출력

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

#!/bin/sh

 

if [ $# -eq 0 ]; then

echo "Error - Number missing form command line argument"

echo "Syntax : $0 number"

echo "Use to print multiplication table for given number"

exit 1

fi

 

n=$1

 

for (( i = 0; i <= 9; i++ )); do

#for i in 1 2 3 4 5 6 7 8 9; do

echo "$n * $i = $(expr $i \* $n)"

done

 

# output

$ bash test.sh 3

3 * 0 = 0

3 * 1 = 3

3 * 2 = 6

3 * 3 = 9

3 * 4 = 12

3 * 5 = 15

3 * 6 = 18

3 * 7 = 21

3 * 8 = 24

3 * 9 = 27

 

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

# for문 range 설정

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

#!/bin/bash

for i in {1..10}; do

echo $i

done

 

# output

$ bash test.sh

1

2

3

4

5

6

7

8

9

10

 

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

# ls 결과 출력하기

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

#!/bin/bash

for i in $(ls); do

echo $i

done

 

# output

$ bash test.sh

01_tip.sh

02_print.sh

03_variable.sh

 

posted by 귀염둥이채원 2021. 4. 15. 08:10

 

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

# Syntax of while case:

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

* case 문은 "case"로 시작하고 "esac"로 끝납니다.

* ")"는 패턴을 종료하는 데 사용됩니다.

* 명령이 있는 패턴은 절이라고하며 모든 절은 (;;)로 끝납니다.

* 별표 기호 *를 사용하여 기본 대소 문자를 정의 할 수 있습니다.

* case 문은 먼저 입력된 $ ariable을 다른 패턴과 일치시킵니다.

패턴이 일치하면 이중 세미콜론 (;;)까지 해당하는 명령 집합이 실행됩니다.

* 정규식을 지원하며 | 기호로 다중 값을 입력 가능하며 조건의 문장 끝에는 ;; 기호로 끝을 표시한다

* 대문자와 소문자는 구별한다.

 

case $variable in

pattern-1)

commands

;;

pattern-2)

commands

;;

pattern-3)

commands

;;

pattern-N)

commands

;;

*)

commands

;;

esac



조건에 다중 값을 사용하고 싶다면 "|" 연산자를 사용한다.

case $variable in

pattern-1 | pattern-2)

commands

....

....

;;

pattern-3 | pattern-4)

commands

....

....

;;

 

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

# 월 이름이 일치하면 해당 월의 해당 이벤트를 표시

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

* "shopt -s nocasematch"는 대소 문자에 관계없이 패턴을 일치시키는 데 사용됩니다.

 

#!/bin/bash

 

shopt -s nocasematch

printf "Enter name of the month: "

read month

 

case $month in

January)

echo " 24th January international Day of Education."

;;

February)

echo " 20 FebruaryWorld Day of Social Justice ."

;;

March)

echo "8th March International women’s day."

;;

April)

echo "7th April The World Health Day"

;;

*)

echo "No matching information found"

;;

esac

 

# output

$ bash test.sh

Enter name of the month: February

20 FebruaryWorld Day of Social Justice

 

$ bash test.sh

Enter name of the month: April

7th April The World Health Day

 

$ bash test.sh

Enter name of the month: april

7th April The World Health Day

 

$ bash test.sh

Enter name of the month: Undefine

No matching information found

 

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

# 국가에 수도 출력

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

#!/bin/bash

shopt -s nocasematch

echo -n "Enter the name of a country: "

read country

 

echo -n "The capital of $country is "

case $country in

UK | "United Kingdom")

echo -n "London"

;;

Turkey)

echo -n "Ankara"

;;

USA)

echo -n "Washington DC"

;;

*)

echo -n "Information not available"

;;

esac

echo ""

 

# output

$ bash test.sh

Enter the name of a country: USA

The capital of USA is Washington DC

 

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

# case문 테스트를 위한 반복문

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

#!/bin/bash

for string in "HELLO" "WORLD" "hello" "world" "s" "start" "end" "etc"; do

 

# case문 시작

case ${string} in

hello | HELLO)

echo "${string}: hello 일때"

;;

wo*)

echo "${string}: wo로 시작하는 단어 일때"

;;

s | start)

echo "${string}: s 혹은 start 일때"

;;

e | end)

echo "${string}: e 혹은 end 일때"

;;

*)

echo "${string}: 기타"

;;

esac

# //case문 끝

 

done

 

# output

$ bash test.sh

HELLO: hello 일때

WORLD: 기타

hello: hello 일때

world: wo로 시작하는 단어 일때

s: s 혹은 start 일때

start: s 혹은 start 일때

end: e 혹은 end 일때

etc: 기타

 

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

# 참고 사이트

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

https://blog.gaerae.com/2015/01/bash-hello-world.html