1) 디렉터리 또는 파일 유형 확인 :

#!/bin/bash

read -p "Input file name : " fname

if [ -e $fname ] #fname 유무여부를 확인한다.

    then
        echo $fname exists
fi

if [ -d $fname ]
    then
        echo $fname is directory
        cd $fname #fname이 디렉터리일 경우 해당 디렉터리로 이동한다.
        pwd
fi

if [ -f $fname ] #fname이 파일인지 여부를 확인한다.

    then
        echo $name is regular file
fi

 


 

 


 

 


2) 파일 중 오래되거나 더 최근 파일을 찾는 프로그램 

 

#!/bin/bash

read -p "Input two file : " fname1 fname2

if [ $fname1 -nt $fname2 ]
    then
        echo $fname1 is newer then $fname2
else
    echo $fname1 is older than $fname2
fi

 

 


 

 


3) Password Digit Count 제한 주기 :

 

Digit Count를 할 때는 ${#password} 와 같이 입력한다.

 

#!/bin/bash

read -p "ID: " id
#read -s -p "Password : " password
prompt="Password : "
while read -p "$prompt" -r -s -n 1 char
 do
  if [[ $char == $'\0' ]]
     then break;
  fi
    prompt='*'
    password+=$char
 done
echo
if [ ${#password} -lt 8 ]
   then
        echo your password must be gretater than 8 digits
        exit 0
fi
echo
echo Your id: $id, Password: $password

 


 

 


 

 


 


*서브쉘 실행

./test.sh

 

*쉘 자체 실행

. test.sh

source test.sh

 

시스템 변수와 로컬변수가 충돌 할 경우 서브쉘로 돌려주는 것이 좋다.

 

예를 들어...아래와 같은 shell파일이 있다고 하면...

 

test.sh

 

#!/bin/bash

HOME=/home/aiadm
echo $HOME

 

test.sh을 실행하기 전에 echo $HOME 입력했을 때

/home/test 였을 경우...

 

./test.sh(서브쉘로 실행)를 실행한 후에 $HOME 환경변수는 바뀌지 않는다.

 

. test.sh(쉘 자체를 실행)를 실행한 후에 $HOME 환경변수는 변경되며...환경변수가 변경될 수 있기 때문에 위험하다.

 


 

 


 

 


 

1) If문 사용하기 :


 

#!/bin/bash

if pwd
    then
        echo pwd command exists
fi

if mypwd
    then
        echo mypwd exists
fi

 

if cat /etc/passwd
    then echo cat exists
fi

if...then...fi

 

 

2) if else문 사용하기

 

#!/bin/bash

read -p "Input User Name : " name

if grep $name /etc/passwd #입력받은 name값이 /etc/passwd 밑에 있으면
        then echo $name exists!!
        else echo $name does not exist
fi

exit 0

 

if...then....else..fi


 

 


 

 


3) if 조건문을 따로 분리할 경우 :

 

#!/bin/bash

read -p "Input User Name : " name
grep $name /etc/passwd
if (($? == 0 ))  # 이전 조건에 에러가 없을 경우

        then echo $name exists!!
        else echo $name does not exist
fi

exit 0

 

4) test 명령어 사용하기 :

 

#!/bin/bash

value="Apple"

if test $value
        then echo Value : $value
else
        echo value is empty
fi

exit 0

 


 

 


 

 


5) 숫자 비교 테스트


n1 -eq n2

=> n1과 n2가 같은지 검사함

n1 -ne n2

=> n1과 n2가 같지 않은지 검사함

n1 -ge n2

=> n1이 n2보다 크거나 같은지 검사함
n1 -gt n2

=> n1이 n2보다 큰지 검사함

n1 -le n2

=> n1이 n2보다 작거나 같은지 검사함

n1 -lt n2

=> n1이 n2보다 작은지 검사함

 

1) 2자리 이상 숫자 쉘 연산

 

#!/bin/bash

add=$[$1 + $2]
sub=$[$1 - $2]
mul=$[$1 * $2]
div=$[$1 / $2]

rst=$[${10} + ${11}]

echo add : $add sub : $sub mul : $mul div : $div
echo
echo rst : $rst

>> . test.sh 10 20 30 40 50 60 70 80 90 100 110

=> {}로 닫아주어야지 그러지 않을 경우 1자리로 인식한다.


 

 


 

 


 

2) 인자를 interactive 하게 받기

 

#!/bin/bash
echo -n "Input your name : "
read name

 

echo -n "Input your age : "
read age

 

echo NAME : $name AGE :  $age

 

 


 

 


 

3) 인자로 Password(입력을 안보이게 받기)를 받기 :

 

#!/bin/bash

read -p "ID: " id
read -s -p "Password : " password

echo
echo Your id: $id, Password: $password

 

 

 

 


 

 


 

 


4) password 입력 시 *로 찍히게 하기 :

 

#!/bin/bash

read -p "ID: " id
#read -s -p "Password : " password


prompt="Password : "

while read -p "$prompt" -r -s -n 1 char
 do
  if [[ $char == $'\0' ]]
     then break;
  fi
    prompt='*'
    password+=$char
 done

echo
echo Your id: $id, Password: $password

 

1) test.sh (pringout time and date & who logged on the server)

 

#! /bin/bash
#Test Shell Program

#pringout time and date
echo time and date :
date

#who logged on the server
echo who logged on the server :
who

 

 

 


 

 


 

 


2) test2.sh (Test how to use environment variables)

 

#!/bin/bash
#Test how to use environment variables

echo Display user information
echo user id : $USER
echo UID : $UID
echo HOME : $HOME

 

 

 


 

 


3) test3.sh (숫자 계산)

 

#!/bin/bash
num1=10
num2=20
num3=30
r_add=$(expr $num1 + $num2 + $num3)
r_sub=$(expr $num2 - $num1)
r_mul=$(expr $num1 \* $num2)
r_div=$(expr $num2 / $num1)
echo $r_add
echo $r_sub
echo $r_mul
echo $r_div



 

 

 


 

 


4) test4.sh (숫자 계산)

 

#!/bin/bash

num1=10
num2=20
num3=30

r_add=$[$num1 + $num2 + $num3]
r_sub=$[$num2 - $num1]
r_mul=$[$num1 * $num2]
r_div=$[$num2 / $num1]

echo $r_add
echo $r_sub
echo $r_mul
echo $r_div

 

 

 

5) shell파일에 인자 넘기기


#!/bin/bash

add=$[$1 + $2]
sub=$[$1 - $2]
mul=$[$1 * $2]
div=$[$1 / $2]

echo add : $add sub : $sub mul : $mul div : $div

=> 실행 :

. test6.sh 3 5

 

*환경 변수 확인

$env

 

*Path(global) 확인

$ env $PATH

또는

$ echo $PATH

 

Path를 만들때는 지우고 새로 만드는 것이 아니라, append를 해야 한다. 지울 경우에는 :

$ unset  ...

 


 

 

 


 

 


 

*쉘 인자 변수 및 특수 변수(중요)

$0 실행된 쉘 스크립트의 이름

$# 스크립트에 넘겨진 인자의 개수

$$ 현재 실행되고 있는 쉘 스크립트의 프로세스 번호

$1~$n

$? 이전 명령어가 제대로 실행됐으면(0으로 표시)

    이전 명령어에 에러가 있으면(127)

    코드종류:
    0 : 명령이 성공적으로 완료됨

    1 : 일반 알 수 없는 오류

    2 : 쉘 명령을 잘못 사용함

    126 : 명령을 실행할 수 없음

    127 : 명령을 찾을 수 없음

    128 : 잘못된 종료 매개변수

    128+x : 치명적인 오류로 리눅스 신호 x를 포함

    130 : <Cntl> + <C> 로 명령이 완료됨

    255 : 범위를 벗어난 종료 상태


 

여기서는 '127 : 명령을 찾을 수 없음'


 

 


 

 


*지역변수를 전역변수로 만들기 :


$echo $my_name

kosta


$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/aiadm/.local/bin:/home/aiadm/bin:/usr/local/bin

$ PATH=$PATH:/home/aiadm/lab/mybin/
$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/aiadm/.local/bin:/home/aiadm/bin:/usr/local/bin:/home/aiadm/lab/mybin/

 

 

PATH=$PATH:/$HOME/lab/mybin

export PATH
 

 

 


 

 


*실행했던 user 확인 :

$ who

 

*오늘 날짜 확인 :

$ date

 

 

*서브쉘로 실행 / 쉘 자체를 실행

 

1) 서브쉘로 돌리기 위해서는

./test.sh

=>하지만 이렇게 할 경우 permission denied가 뜬다. 실행가능한 파일로 만들어주기 위해서는 chmod+x test.sh 하고 입력해주어야 한다.

 

2) 쉘 자체를 실행시키려면

. test.sh

 

 

*압축(tar) :

tar -cvf 하하하.tar (tar로 압축)

tar -zcvf 하하하.tar.gz (gzip으로 압축)

tar -xvf 하하하.tar(압축풀기)

 

*실행중인 프로세스 확인 :
ps -ef

ps -f

 

*실행중인 프로세서 Kill :
kill -9 숫자

(ex: kill -9 123)

 

*CPU 및 메모리 확인 :
top           

                                                                                                          

 

 

 


 

 


*환경변수 :

같은 시스템이더라도...

 

창을 새로 띄울때마다 Shell이 달라진다.

Shell이 가지고 있는 환경변수가 계속 달라진다.


'-' 가 붙어 있느냐 없느냐에 따라 차이가 큼

-는 로그인 Shell(환경변수를 모두 가지고 오겠다는것!!)

(ex: su - root <==> su root)


 

 


 

 


*서브쉘이란?
쉘 명령어를 괄호()로 묶어서 실행하면 (프로세스 리스트) 서브 쉘로 실행됨.

$ ((sleep 10); sleep 20) &

$ ps --forest

로 확인

uname -r

cd /lib/modules

uname -r

내가 사용하고 있는  linux 버전 확인

cd /lib/modules/$(uname -r) = cd /lib/modules/4.8.0-36-generic$ ls

cd ${pwd}

 

./<shell script>.sh => 서브쉘로 돌게 된다.


 

*co-processing 이용하기

coproc sleep 10

Subshell로 백그라운드로 돈다

 

 


 

 


 

*파일권한변경:
chmod

chown

 

 

*부모쉘과 자식쉘(Hirarchy 상으로 실행시킨 부모 쉘 확인):
ps --forest

 

 

 

여기서 process 22482(PID)를 실행한 것은 21687(PPID)이다.

 

*절대경로 확인(builtin인지 여부 확인):

type -a ...

(ex: type -a pwd)

 

*Shell이 가지고 있는 환경변수는 아래와 같이 표현한다:
(pwd; ls; cd /etc; pwd; cd; pwd; ls; echo $BASH_SUBSHELL)

 

+ Recent posts