[shell script] bash read command

참고 : http://wiki.redjini.com/linux/script

옵션

  • -n number : number 수만큼의 문자를 입력받음
  • -p string : 프로프트에 string 문자열 출력
  • -a        : 입력을 Array형태로 저장
  • -s        : 입력을 프로프트에 출력하지 않음
  • -d char   : 입력이 char 이면 read 명령을 종료함.

 shell script 내에서 문자열을 array에 저장하기

#!/bin/sh

VMSTATLOG=$(vmstat 1 2 | sed -e '1,3d')
read -ra ARRAY <<< "$VMSTATLOG"
echo "${ARRAY[@]}"
#  VMSTATLOG에 저장된 값을 ARRAY변수에 배열로 저장
#  구분자는 기본 공백, 구분자를 변경하려면 IFS 값을 설정하면됨.

참고 : [shell script] 배열(Array) 사용하기

shell script 내에서 문자열 입력받기

#!/bin/sh

read -n 1 -p "input [y/N]:"
echo "$REPLY"
#기본적으로 read는 입력값을 REPLY 변수에 저장함

#!/bin/sh

read -n 1 -p "input [y/N]:" yesno
echo "$yesno"
#입력값을 REPLY이 아닌 yesno 변수에 저장

#!/bin/sh

read  -p "input yes|no count :" yesno count
echo "$yesno"
echo "$count"
#입력값을 순차적으로 yesno, count에 저장
# 구분자는 기본 공백, 구분자를 변경하려면 IFS 값을 설정하면됨.

2014/02/11 18:58 2014/02/11 18:58
태그 : , , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

Step 1:

 /etc/bashrc 파일 마지막 라인에 다음 사항 추가

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "[$(whoami)][$PWD][$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Step 2:

/etc/syslog.config 파일에 다음사항 추가

local6.*                                                /var/log/cmdlog.log

syslog 재시작
   #> service syslog restart

출력예:

Jan 26 22:31:32 localhost root: [root][/root][12547]: tail -f /var/log/messages [130]
Jan 26 22:31:45 localhost root: [root][/root][12547]: vi /etc/syslog.conf  [0]
Jan 26 22:44:19 localhost root: [root][/root][12547]: source /etc/bashrc  [0]
Jan 26 22:44:20 localhost root: [root][/root][12547]: ll [0]
Jan 26 22:44:21 localhost root: [root][/root][12547]: ls -la [0]
Jan 26 22:44:23 localhost root: [root][/root][12547]: pwd [0]
Jan 26 22:49:05 localhost root: [root][/root][2646]: vi /etc/bashrc  [0]
2014/01/27 13:50 2014/01/27 13:50
태그 : , , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다
Linux 콘솔창에서 키입력시 나는 비프음(beep) 끄기.
[root@localhost ~]# vi /etc/inputrc
# do not bell on tab-completion
set bell-style none
2014/01/27 11:56 2014/01/27 11:56
태그 : , , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

[shell] netstat

usage: netstat [-veenNcCF] [<Af>] -r         netstat {-V|--version|-h|--help}
      netstat [-vnNcaeol] [<Socket> ...]
      netstat { [-veenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s } [delay]

       -r, --route                display routing table
       -I, --interfaces=[<Iface>] display interface table for <Iface>
       -i, --interfaces           display interface table
       -g, --groups               display multicast group memberships
       -s, --statistics           display networking statistics (like SNMP)
       -M, --masquerade           display masqueraded connections

       -v, --verbose              be verbose
       -n, --numeric              don't resolve names
       --numeric-hosts            don't resolve host names
       --numeric-ports            don't resolve port names
       --numeric-users            don't resolve user names
       -N, --symbolic             resolve hardware names
       -e, --extend               display other/more information
       -p, --programs             display PID/Program name for sockets
       -c, --continuous           continuous listing

       -l, --listening            display listening server sockets
       -a, --all, --listening     display all sockets (default: connected)
       -o, --timers               display timers
       -F, --fib                  display Forwarding Information Base (default)
       -C, --cache                display routing cache instead of FIB
       -T, --notrim               stop trimming long addresses
       -Z, --context              display SELinux security context for sockets

예제(라우팅 정보 출력)

[root /]# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.62.0    0.0.0.0         255.255.255.0   U         0 0          0 eth1
211.174.62.0    0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth1
0.0.0.0         211.174.62.1    0.0.0.0         UG        0 0          0 eth0

예제( Listen 정보 출력)

[root /]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address           State       PID/Program name
tcp        0      0 0.0.0.0:49444               0.0.0.0:*                 LISTEN      2297/rpc.statd
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                 LISTEN      2604/xinetd
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                 LISTEN      2928/mysqld
tcp        0      0 0.0.0.0:29998               0.0.0.0:*                 LISTEN      -
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                 LISTEN      2272/portmap
tcp        0      0 127.0.0.1:631               0.0.0.0:*                 LISTEN      2570/cupsd
tcp        0      0 :::80                       :::*                      LISTEN      5999/httpd
tcp        0      0 :::22                       :::*                      LISTEN      2588/sshd
tcp        0      0 :::443                      :::*                      LISTEN      5999/httpd
2014/01/22 00:00 2014/01/22 00:00
태그 : , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

참고 : http://wiki.redjini.com/linux/script

배열(Array) : 선언하기

array_name_1=("value 1" "value 2" "value 3")
array_name_2=(1 2 3)

배열(Array) : 참조하기

array_name=("value 1" "value 2" "value 3")

echo "array_name[0]     = ${array_name[0]}"  #print array_name[0]
echo "array_name[2]     = ${array_name[2]}"  #print array_name[2]
echo "array_name[*]     = ${array_name[*]}"  #print array_name all item
echo "array_name[@]     = ${array_name[@]}"  #print array_name all item
echo "array_name index  = ${!array_name[@]}" #print array_name index number
echo "array_name size   = ${#array_name[@]}" #print array_name size
echo "array_name[0] size= ${#array_name[0]}" #print array_name[0] size

출력 결과

array_name[0]     = value 1
array_name[2]     = value 3
array_name[*]     = value 1 value 2 value 3
array_name[@]     = value 1 value 2 value 3
array_name index  = 0 1 2
array_name size   = 3
array_name[0] size= 7

배열(Array) : 크기 구하기

array_name_1=("value 1" "value 2" "value 3")

echo ${#array_name_1[@]}  #print "3"

배열(Array) : 출력하기

array_name=("value 1" "value 2" "value 3")

echo "array = ${array_name[@]}"
# 출력 결과
# array = value 1 value 2 value 3

printf "value = %s\n" "${array_name[@]}"
# 출력 결과
# value = value 1
# value = value 2
# value = value 3

for value in "${array_name[@]}"; do
    echo $value
done
# 출력 결과
# value 1
# value 2
# value 3

for (( i = 0 ; i < ${#array_name[@]} ; i++ )) ; do
    echo "value[$i] = ${array_name[$i]}"
done
# 출력 결과
# value[0] = value 1
# value[1] = value 2
# value[2] = value 3

for index in ${!array_name[*]} ; do
    printf "%4d: %s\n" "$index" "${array_name[$index]}"
done
# 출력 결과
#   0: value 1
#   1: value 2
#   2: value 3

 

2014/01/10 19:36 2014/01/10 19:36
태그 : , , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

참고 : http://wiki.redjini.com/linux/script

사용법

function name(){
  shell command
}

예제

function my_function(){
   echo "my function"
}

my_function

지역변수 (Local variables)

value=1234;

function my_function(){
   local value=5678
   echo "function: value= ${value}"
}

echo "before  : value= ${value}"

# call my_function
my_function

echo "after   : value= ${value}"

실행결과

before  : value= 1234
function: value= 5678
after   : value= 1234

인자 : parameters

function my_function(){
   local value=$1
   echo "my_function= ${value}"
}

# call my_function
my_function 5678

결과 전달받기

#!/bin/sh
function my_function(){
   local value=$1
   echo "my_function= ${value}"
}

# call my_function
result=$(my_function 5678)

echo "my_function [ ${result} ]"

function my_function(){
    echo "argv: $1 $2"
    return 10
}

# call my_function
my_function "myname" "acepro"
result=$?

echo "my_function [ ${result} ]"

function my_function(){
    echo "argv: $1 $2"
    eval "$3='result'"
}

# call my_function
result=""
my_function "myname" "acepro" result

echo "my_function [ ${result} ]"

2014/01/09 18:23 2014/01/09 18:23
태그 : , , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

[shell script] directory exists check

#!/bin/sh
if [ -d "$DIRECTORY" ]; then
     echo "$DIRECTORY exists." 
fi

#!/bin/sh
if [ ! -d "$DIRECTORY" ]; then
    echo "$DIRECTORY doesn't exists." 
fi

#!/bin/sh
if [ -L "$DIRECTORY" ]; then
    echo "$DIRECTORY symbolic link" 
fi 

2013/11/20 18:40 2013/11/20 18:40
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다
#!/bin/sh
EXE_PATH=$(readlink -f $(dirname "$0"))

echo ${EXE_PATH}
2013/10/24 12:02 2013/10/24 12:02
태그 : , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

셈플소스

#!/bin/sh
name="abcd efghi"

#변수값 출력
echo "\$name       =$name  "
echo "\${name}     =${name}"

#문자열 길이 출력
echo "\$name length=${#name}"

#변수의 특정 위치부터 출력
#${name:offset}
echo "\${name:2}   =${name:2}"
#${name:offset:length}
echo "\${name:2:5} =${name:2:5}"

#변수 초기화
#${name:=value}
#name 변수 값이 null이면 value 값으로 초기화
echo "\${name2:=1234 5}=${name2:=1234 5}"
echo "\${name2:=123456}=${name2:=123456}"

#${name:+value}
#name 변수 값이 null 아니면 value값 return
echo "\${name2:+123456}=${name2:+123456}"
echo "\${name3:+123456}=${name3:+123456}"

#${name:-value}
#name 변수 값이 null 이면 value값 return, 아니면 name 값 return
echo "\${name2:-123456}=${name2:-123456}"
echo "\${name3:-123456}=${name3:-123456}"

#${name:?value}
#name 변수 값이 null 아니면 name 값을 출력하고 null이면 value 값 출력후 오류
echo "\${name2:?123456}=${name2:?123456}"
echo "\${name2:?123456}=${name3:?123456}"

스크립트 실행 결과

$name       =abcd efghi
${name}     =abcd efghi
$name length=10
${name:2}   =cd efghi
${name:2:5} =cd ef
${name2:=1234 5}=1234 5
${name2:=123456}=1234 5
${name2:+123456}=123456
${name3:+123456}=
${name2:-123456}=1234 5
${name3:-123456}=123456
${name2:?123456}=1234 5
value.sh: line 37: name3: 123456
2008/07/29 09:59 2008/07/29 09:59
태그 : , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

[shell] ps 명령어 사용법

ps [-option]

[사용예]
    $ ps -ef
    $ ps -aux | grep httpd
   
[option]
    -a    : 모든 프로세스를 나열
    -c    : 해당 프로세스를 유발시킨 명령어 이름을 task struct에 참조한다.
    -e    : 해당 프로세스에 관련된 환경변수 정보를 함께 출력
    -f    : 프로세스 간 상속관계를 트리 구조를 보여줌
    -h    : 메뉴는 보여주지 않음. (PID, TTY, STAT, TIME, COMMAND 등)
    -j    : 작업에 관련된 ID를 출력
    -l    : j보다 자세하게 정보를 출력
    -u    : 사용자 이름과 프로세스가 시작된 시간을 출력
    -x    : 터미널에 종속되지 않는 프로세스들을 출력
    -n    : 사용자 정보를 ID와 숫자로 표시
    -w    : 출력 결과를 생략하지 않고 출력

[출력 항목]
    PID     : 프로세스 식별번호
    TTY     : 프로세스와 연결된 터미널 포트
    STAT    : 프로세스 상태
                R  실행 중 혹은 실행될 수 있는 상태
                S  sleep
                I  idle (비활동 상태:BSD, 중간적 상태:sys V)
                T  정지된 상태(suspend)
                Z  좀비(zombie) 프로세스
                D  디스크 관련 대기 상태
                P  페이지 관련 대기 상태
                X  메모리 확보를 위해 대기중(sys V)
                K  사용 가능한 커널 프로세스(aix)
                W  스왑 out된 상태
                N  nice되어진 상태
                >  우선 순위가 인위적으로 높아진 상태
    START   : 프로세스가 시작된 시간
    TIME    : 총 CPU 사용 시간
    USER    : 사용자의 이름
    COMMAND : 사용자가 실행한 명령어
    UID     : 사용자의 ID
    PGID    : 사용자 부모 프로세스의 그룹 ID
    SID     : 세션 ID
    PRI     : 실행하는 우선 순위에 따른 프로세스
    NI      : nice에 의한 우선 순위에 따른 프로세스
    RSS     : 실제 메모리 사용량
    SZ      : 프로세스가 사용하는 자료와 스택의 크기
    SHRD    : 프로세스가 사용하는 공유 메모리
    %CPU    : 프로세스가 사용하는 CPU 점유율
    %MEM    : 프로세스가 사용하고 있는 메모리 점유율
    WCHAN   : 프로세스가 실행하고 있는 커널 루틴
    VSZ     : 가상메모리 크기

2008/04/10 12:34 2008/04/10 12:34
태그 : , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다