shell_script

shell 명령어

sysman 2021. 7. 26. 20:20

쉘 스크립트 

 

확장자는 sh 사용

#!/bin/bash  // 쉘 스크립트 사용을 알림

 

 

 

쉘 스크립트 실행 2가지

- sh명령어 사용

   #sh my.sh

 

- chmod명령어 사용

  #chmod +x my.sh

  #./my.sh

 

변수

[root@test1 stest]# cat myshell.sh
#!/bin/bash

#변수
language="korean"  

echo "I can speak $language"

[root@test1 stest]# ./myshell.sh
I can speak korean

 

변수선언 - 폴더생성

[root@test1 stest]# ls -als
total 8
0 drwxrwxr-x.  2 team01 team01   24 Jul 26 19:43 .
4 drwx------. 18 team01 team01 4096 Jul 26 19:44 ..
4 -rwxrwxr-x.  1 team01 team01   31 Jul 26 19:43 myshell.sh

[root@test1 stest]# cat mkdir.sh
#!/bin/bash
language="test1 test2 test3"
mkdir $language

[root@test1 stest]# sh mkdir.sh
[root@test1 stest]# ls
mkdir.sh  myshell.sh  test1  test2  test3

 

함수
[root@test1 stest]# cat myshell.sh
#!/bin/bash

function print() {
echo $1
}
print "I can speak korean"




전역변수
[root@test1 stest]# cat myshell.sh
#!/bin/bash
lang="korean"
function print() {
echo "I am $lang"
}
print





지역변수
[root@test1 stest]# cat myshell.sh
#!/bin/bash

# 전역변수
lang="korean"

function learn() {
#지역변수
local learn_lang="english"
echo "I study $learn_lang"
}

function print() {
#print 함수의 첫번째 변수값을 입력
echo "I am $1"
}

learn
print $lang
#지역변수라 변수값을 못 읽어오므로 그냥 print함수의 I am만 출력
print $learn_lang

 

변수 설명 비고
HOME 사용자 홈 디렉토리  
PATH 실행 파일 찾을 디렉토리 경로  
FUNCNAME 현재 함수 이름  
LANG 기본 지원되는 언어  
PWD 사용자 현재 작업 중인 디렉토리  
TERM 로그인 터미널 타입  
SHELL 로그인 중인 쉘  
USER 사용자 이름  
USERNAME 사용자 이름  

 

변수 설명 비고
GROUP 사용자그룹  
DISPLAY X디스플레이 이름  
COLUMNS 현재 터미널 또는 윈도우 터미널 컬럼수  
LINES 터미널의 라인 수  
PS1 기본 프롬프트 변수  
PS2 보조 프롬프트 변수  
PS3 쉘 스크립트에서 select 사용시 프롬프트변수  
PS4 쉘 스크립트 디버깅 모드의 프롬프트 변수  
BASH BASH 실행파일 경로  

 

변수 설명 비고
GROUP 사용자그룹  
DISPLAY X디스플레이 이름  
COLUMNS 현재 터미널 또는 윈도우 터미널 컬럼수  
LINES 터미널의 라인 수  
PS1 기본 프롬프트 변수  
PS2 보조 프롬프트 변수  
PS3 쉘 스크립트에서 select 사용시 프롬프트변수  
PS4 쉘 스크립트 디버깅 모드의 프롬프트 변수  
BASH BASH 실행파일 경로  

 

BASH_VERSION 설치된 BASH 버전  
BASH_ENV 스크립트 실행 시 BASH 시작파일을 읽을 위치 변수  
HISTFILE history 파일 경로  
HISTFILESIZE history 파일 크기  
HISTSIZE history 저장되는 개수  
HOSTNAME 호스트 이름  
HOSTTYPE 시스템 하드웨어 종류  
MACHTYPE 머신종류(hosttype의 상세 표시)  
MAIL 메일 보관 경로  
LOGNAME 로그인 이름  
TMOUT 0이면 제한 없으며, time 시간 지정 시 지정한 시간 이후 로그아웃  
SECONDS 스크립트가 실행된 초 단위 시간  
UID 사용자 UID  
OSTYPE 운영체제 종류  
[team01@test1 ~]$ echo $HOME
/home/team01
[team01@test1 ~]$ echo $PATH
/home/team01/.local/bin:/home/team01/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
[team01@test1 ~]$ echo $LANG
C
[team01@test1 ~]$ echo $PWD
/home/team01
[team01@test1 ~]$ echo $TERM
xterm
[team01@test1 ~]$ echo $SHELL
/bin/bash
[team01@test1 ~]$ echo $USER
team01
[team01@test1 ~]$ echo $USERNAME

[team01@test1 ~]$ echo $GROUP  //소속그룹이 없음 그래서 비어 있다.

[team01@test1 ~]$ echo $DISPLAY
localhost:10.0
[team01@test1 ~]$ echo $COLUMNS //터미널 컬럼수
119
[team01@test1 ~]$ echo $LINES
34
[team01@test1 ~]$ echo $PS1  //페도라 계열
[\u@\h \W]\$
[team01@test1 ~]$ echo $PS2
>
[team01@test1 ~]$ echo $PS3 

[team01@test1 ~]$ echo $PS4 //기본값 +
+
[team01@test1 ~]$ echo $BASH
/bin/bash
[team01@test1 ~]$ echo $BASH_VERSION
4.4.19(1)-release
[team01@test1 ~]$ echo $HISTFILE
/home/team01/.bash_history
[team01@test1 ~]$ echo $HISTFILESIZE
1000
[team01@test1 ~]$ echo $HISTSIZE
1000
[team01@test1 ~]$ echo $HOSTNAME
test1.example.com
[team01@test1 ~]$ echo $HOSTTYPE  //시스템 하드웨어 종류
x86_64
[team01@test1 ~]$ echo $MACHTYPE
x86_64-redhat-linux-gnu
[team01@test1 ~]$ echo $MAIL
/var/spool/mail/team01
[team01@test1 ~]$ echo $LOGNAME
team01
[team01@test1 ~]$ echo $SECONDS  //시스템 명령어 실행된 시간
282
[team01@test1 ~]$ echo $UID  //사용자 uid
1000
[team01@test1 ~]$ echo $OSTYPE //운영체제 종류
linux-gnu
[team01@test1 ~]$

위치 매개변수(대체적으로 $1..$3을 많이 사용)

매개변수 설명
$0 실행된 스크립트 이름
$1 $1 $2 $3 ... ${10} 파라미터 순서대로 번호가 부여 (10번쨰부터는 "{ }"로 감싸줘야함
$* 전체 인자값
$@ 전체 인자 값($*는 동일하지만 쌍따옴표로 변수를 감싸면 다른 결과가 나옴)
$# 매개변수의 총 개수

 

차이점

[team01@test1 ~]$ cat mylang.sh
#!/bin/bash

echo "this is $0"
echo "I can $1 and $2"
echo "this shell are $*"
echo "this shell are $@"
echo "this para count is $#"

[team01@test1 ~]$ sh mylang.sh korean english
this is mylang.sh
I can korean and english
this shell are korean english
this shell are korean english
this para count is 2



동일
[team01@test1 ~]$ cat mylang1.sh
#!/bin/bash

for lang in $* <-- 주목
do
  echo "I can speak $lang"
done

[team01@test1 ~]$ sh mylang1.sh korean english "japan china"
I can speak korean
I can speak english
I can speak japan
I can speak china

동일
[team01@test1 ~]$ cat mylang1.sh
#!/bin/bash

for lang in $@  <-- 주목
do
  echo "I can speak $lang"
done

[team01@test1 ~]$ sh mylang1.sh korean english "japan china"
I can speak korean
I can speak english
I can speak japan
I can speak china




다름
[team01@test1 ~]$ cat mylang1.sh
#!/bin/bash

for lang in "$*"  <-- 주목
do
  echo "I can speak $lang"
done

[team01@test1 ~]$ sh mylang1.sh korean english "japan china"
I can speak korean english japan china




다름
[team01@test1 ~]$ cat mylang1.sh
#!/bin/bash

for lang in "$@"  <-- 주목
do
  echo "I can speak $lang"
done

[team01@test1 ~]$ sh mylang1.sh korean english "japan china"
I can speak korean
I can speak english
I can speak japan china

 

매개변수 설명
$$ 현재스크립트, 명령어PID
$? 최근 실행된 명령어, 함수, 스크립트 종료 상태
$! 최근 실행한 백그라운드 명령어 PID
$- 현재 옵션 플래그
$변수 현재 문자열에서 해당 변수를 파라미터값으로 치환
${변수} 위와 같지만 { }를 사용함으로써 뒤에 오는 문자열과 구분가능
[team01@test1 ~]$ AUTH_URL="www.exam.com/"
[team01@test1 ~]$ echo "http://$AUTH_URLlgon.html"
http://.html



// {} 대괄호로 분리해줌
[team01@test1 ~]$ echo "http://${AUTH_URL}lgon.html"
http://www.exam.com/lgon.html

 

확장자 설명
${변수-문자열} 변수가 설정되지 않은 경우 문자열로 변수 치환
${변수:-문자열} 변수가 설정되지 않았거나 null로 설정된 경우 문자열로 변수 치환
${변수=문자열} 변수가 설정되지 않은 경우 문자열을 변수에 저장하고 변수 치환
${변수:=문자열} 변수가 설정되지 않았거나 null로 설정된 경우 문자열을 변수에 저장하고 변수 치환
${변수+문자열} 변수가 설정된 경우 문자열로 변수 치환
${변수:+문자열} 변수가 설정되고, null이외의 값으로 설정된 경우 문자열로 변수 치환
${변수?에러메세지} 변수가 설정된 경우 변수의 값을 사용하며, 설정되지 않은 경우 표준오류 출력으로 에러 메시지를 출력
${변수:?에러메세지} 변수가 null이외의 값으로 설정된 경우 변수의 값을 사용하며, 변수가 설정되지 않았거나 null인 경우 에러 메시지를 출력하고 쉘을 종료
${변수:시작위치} 변수값이 문자열일 경우 시작위치부터 문자열 길이 끝까지 출력
${변수:시작위치:길이} 변수값이 문자열일 경우 시작 위치부터길이까지 출력
변수가 null일때만 ubuntu 적용
[team01@test1 ~]$ OS_TYPE=redhat
[team01@test1 ~]$ echo ${OS_TYPE:-ubuntu}
redhat
[team01@test1 ~]$ echo ${OS_TYPE-ubuntu}
redhat
[team01@test1 ~]$ unset OS_TYPE
[team01@test1 ~]$ echo ${OS_TYPE-ubuntu}
ubuntu
[team01@test1 ~]$ echo ${OS_TYPE:-ubuntu}
ubuntu
[team01@test1 ~]$ OS_TYPE=""
[team01@test1 ~]$ echo ${OS_TYPE:-ubuntu}
ubuntu





변수 치환
[team01@test1 ~]$ OS_TYPE=""
[team01@test1 ~]$ echo ${OS_TYPE:=ubuntu}
ubuntu
[team01@test1 ~]$ echo ${OS_TYPE=ubuntu}
ubuntu
[team01@test1 ~]$ echo $OS_TYPE
ubuntu
[team01@test1 ~]$ echo ${OS_TYPE:+redhat}
redhat
[team01@test1 ~]$ echo ${OS_TYPE+redhat}
redhat
[team01@test1 ~]$ echo $OS_TYPE
ubuntu




변수:?에러메세지 출력
[team01@test1 ~]$ OS_TYPE="redhat"
[team01@test1 ~]$ echo ${OS_TYPE:?null or not set}
redhat
[team01@test1 ~]$ echo ${OS_TYPE:?null not set}
redhat
[team01@test1 ~]$ unset OS_TYPE
[team01@test1 ~]$ echo ${OS_TYPE:?null or not set}
-bash: OS_TYPE: null or not set
[team01@test1 ~]$ echo $1

[team01@test1 ~]$ echo $?
0                          //정상종료
[team01@test1 ~]$ echo ${OS_TYPE:?null or not set}
-bash: OS_TYPE: null or not set
[team01@test1 ~]$ echo $?
1                         //비정상 종료

 

확장자 설명
${변수#패턴} 변수에 설정된 문자열 앞에서부터 처음 찾은 패턴과 일치하는 패턴 앞의 모든 문자열 제거
${변수##패턴} 변수에 설정된 문자열 앞에서부터 마지막으로 찾은 패턴과 일치하는 패턴 앞의 모든 문자열 제거
${변수%패턴} 변수에 설정된 문자열 뒤에서부터 처음 찾은 패턴과 일치하는 패턴 뒤의 모든 문자열 제거
${변수%%패턴} 변수에 설정된 문자열 앞에서부터 마지막으로 찾은 패턴과 일치하는 패턴 뒤의 모든 문자열 제거
${#변수} 변수의 길이 리턴
${변수/찾을 문자열/바꿀문자열} 변수에 설정된 문자열에서 첫번쨰 패턴에 해당하는 부분을 문자열로 변경 문자열을 지정하지 않으면 해당 문자열을 제거
${변수/#찾을 문자열/바꿀문자열} 변수에 설정된 문자열의 시작 문자열이 패턴과 맞는 경우 문자열로 변경
${변수/%찾을 문자열/바꿀문자열} 변수에 설정된 문자열의 마지막 문자열이 패턴과 맞는 경우 문자열로 변경
처음 앞쪽을 자르거나 뒤쪽을 자를 때
[team01@test1 ~]$ FILE_NAME="myvm_container-repo.tar.gz"
[team01@test1 ~]$ echo ${FILE_NAME#*}
myvm_container-repo.tar.gz
[team01@test1 ~]$ echo ${FILE_NAME#*_}
container-repo.tar.gz
[team01@test1 ~]$ echo ${FILE_NAME##*-}
repo.tar.gz
[team01@test1 ~]$ echo ${FILE_NAME%.*}
myvm_container-repo.tar
[team01@test1 ~]$ echo ${FILE_NAME%%.*}
myvm_container-repo
[team01@test1 ~]$





파일명 또는 파일 경로 추출
[team01@test1 ~]$ FILE_PATH="/etc/nova/nova.conf"
[team01@test1 ~]$ echo ${FILE_PATH%/*}
/etc/nova
[team01@test1 ~]$ echo ${FILE_PATH##*/}
nova.conf
[team01@test1 ~]$ echo ${#FILE_PATH}
19
[team01@test1 ~]$





문자나 단어를 다른 단어로 변경
[team01@test1 ~]$ OS_TYPE="redhat linux ubuntu linux fedora linux"
[team01@test1 ~]$ echo ${OS_TYPE/linux/OS}
redhat OS ubuntu linux fedora linux
[team01@test1 ~]$ echo ${OS_TYPE//linux/OS}
redhat OS ubuntu OS fedora OS
[team01@test1 ~]$ echo ${OS_TYPE/linux}
redhat ubuntu linux fedora linux
[team01@test1 ~]$ echo ${OS_TYPE//linux}
redhat ubuntu fedora
[team01@test1 ~]$ echo ${OS_TYPE/#redhat/Unknown}
Unknown linux ubuntu linux fedora linux
[team01@test1 ~]$ echo ${OS_TYPE/%linux/Unknown}
redhat linux ubuntu linux fedora Unknown
[team01@test1 ~]$

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'shell_script' 카테고리의 다른 글

shell 기본 sed  (0) 2021.07.30
shell 기본 awk  (0) 2021.07.29
shell 기본 find  (0) 2021.07.29
shell 기본 grep  (0) 2021.07.27
shell 기본 명령문  (0) 2021.07.27