쉘 스크립트
확장자는 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의 상세 표시) | |
메일 보관 경로 | ||
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 |