bash (1)

정승균·2020년 12월 17일
0

리눅스

목록 보기
19/29
post-thumbnail

Ⅰ. bash script file


  • 확장자로 .sh을 사용

  • 첫 문단에 #! /bin/bash 을 써서 실행 쉘 선언 (셔뱅)

  • 실행 방법:

    • $ bash myscript.sh : x 권한이 없어도 됨

    • $ ./myscript.sh : x 권한이 있어야 함

    • . myscript.sh or source myscript.sh : 설정파일을 불러올 때만 씀


Ⅱ. 변수


1. 일반 변수

  • 기본적으로 문자열로 저장됨
명령어설명
var=value변수 선언
${var}변수 불러오기, 중괄호 생략 가능
unset var변수 제거
${#var}변수 길이
${var:start}start째 문자부터 마지막 문자까지 슬라이싱
${var:start:len}start째 문자부터 len개만큼 슬라이싱 , len은 음수도 가능

2. 정수형 변수

  • declare -i var 로 선언
jsg@jsg-ubuntu:~$ declare -i var1=123
jsg@jsg-ubuntu:~$ declare -i var2=abc
jsg@jsg-ubuntu:~$ echo var1:$var1 var2:$var2
var1:123 var2:0

3. Array형 변수

명령어설명
declare -a arr=(value1 value2 ...)배열 선언
arr[i]=value요소 지정
${#arr[@]} or ${#arr[*]}어레이 길이
${arr[i]}i 번째 요소
${arr[@]}전체 요소, IFS를 기준으로 분리
"${arr[@]}"전체 요소, 인덱스를 기준으로 분리
${arr[*]}전체 요소, 인덱스를 기준으로 분리
"${arr[*]}"전체 요소를 IFS로 구분자로 한줄로 반환
${arr[@]:3:2}슬라이싱
jsg@jsg-ubuntu:~$ cat test.sh
#!/bin/bash
arr[${#arr[@]}]="Hello World"
arr[${#arr[@]}]="Bash Practice"
echo "Using IFS={$IFS}"
for i in ${arr[@]}
do
	echo "arr[@] = $i"
done
IFS=
echo "Using IFS={$IFS}"
for i in ${arr[@]}
do
	echo "arr[@] = $i"
done
echo "Using @ with quotation mark"
for i in "${arr[@]}"
do
	echo "arr[@] = $i"
done
echo 'Using *'
for i in ${arr[*]}
do
	echo "var[*] = $i"
done
echo 'Using * with quoatation mark'
for i in "${arr[*]}"
do
	echo "var[*] = $i"
done

jsg@jsg-ubuntu:~$ bash test.sh
Using IFS={ 	
}
arr[@] = Hello
arr[@] = World
arr[@] = Bash
arr[@] = Practice
Using IFS={}
arr[@] = Hello World
arr[@] = Bash Practice
Using @ with quotation mark
arr[@] = Hello World
arr[@] = Bash Practice
Using *
var[*] = Hello World
var[*] = Bash Practice
Using * with quoatation mark
var[*] = Hello WorldBash Practice

4. 환경변수

  • 자식 프로세스에게 상속됨
  • 관습적으로 대문자를 씀

a. 환경변수 설정

export VAR		# 이미 var값이 있는 경우
export VAR=value	# 새로 선언을 하는 경우
declare -x VAR=value	# ksh 스타일

b. TERM

  • 터미널 종류

c. EDITOR

  • 명령어를 지정한 에디터에서 쓰기

  • $EDITOR=vim 환경변수 설정 후 터미널에서 Ctrl-X Ctrl-E

d. PATH

  • 명령어 탐색 경로
  • 특정 경로를 추가 할 시
# 잘못된 방법
# ~/.bashrc 파일
export PATH=~/development/sdk/bin:$PATH
#올바른 방법
# ~/.bashrc 파일에 삽입
if [ "$(type -t pathmunge)" != 'function' ]; then
	pathmunge () {
		[ ! -d "$1" ] && return 1
		case ":${PATH}:" in
			*:"$1":*)
				;;
			*)
				if [ "$2" = "after" ] ; then
					PATH=$PATH:$1
				else
					PATH=$1:$PATH
				fi
		esac
	}
fi
pathmunge $HOME/development/sdk/bin after

5. 특별 변수

변수설명
$$현재 쉘의 PID
$!마지막으로 실행된 백그라운드 프로세스의 PID
$?최근 포그라운드 프로세스의 종료값
$#인수의 개수 (0번째 제외)
${arr[@]}전체 요소, IFS를 기준으로 분리
$0, $1, $2, ...인수 리스트
$*전체 인수 목록, " "로 감싸기 가능
$@전체 인수를 문자열의 배열, " "로 감싸기 가능
${*:2}인수 슬라이싱
${var:=value}변수가 null이면 value를 할당하고 반환
${var:-value}변수가 null이면 value를 할당하지 않고 반환
${var:+value}변수가 null이면 그대로, null이 아니면 value를 할당하지 않고 반환
${var:?error}변수가 null이면 error 메세지 출력
$_이전 명령어의 마지막 인수
$-on 되어 있는 실행 옵션

Ⅲ. Quotation mark


1. ' '

  • 문자열을 표기, 특수문자를 해석하지 않음
jsg@jsg-ubuntu:~$ var1='echo $HOME'
jsg@jsg-ubuntu:~$ echo $var1
echo $HOME

2. " "

  • 문자열을 표기, 특수문자를 그대로 해석
jsg@jsg-ubuntu:~$ var1="echo $HOME"
jsg@jsg-ubuntu:~$ echo $var1
echo /home/jsg

3. \

  • 특별문자를 일반문자로 해석
jsg@jsg-ubuntu:~$ var3="echo \$HOME"
jsg@jsg-ubuntu:~$ echo $var3
echo $HOME

4. ` `

  • 명령어로 해석
  • 가독성으로 인해 보통 $(...)을 더 많이 쓴다
jsg@jsg-ubuntu:~$ var4=`echo $HOME`
jsg@jsg-ubuntu:~$ echo $var4
/home/jsg

Ⅳ. Parenthesis


1. (string)

  • string을 명령어로 인식하고 서브쉘로 실행
jsg@jsg-ubuntu:~$ echo $(date)
2020. 12. 18. (금) 22:33:48 KST

2. ((string))

  • string을 수치연산으로 해석
  • let으로 대체 가능
jsg@jsg-ubuntu:~$ a=10; b=20
jsg@jsg-ubuntu:~$ echo $((a+b))
30
jsg@jsg-ubuntu:~$ let c=a+b
jsg@jsg-ubuntu:~$ echo $c
30

3. {string1,string2,...}

  • 문자열 그룹으로 해석
jsg@jsg-ubuntu:~$ for str in a{b,c,d}e;do echo $str;done
abe
ace
ade
  • {숫자..숫자} 도 가능
jsg@jsg-ubuntu:~$ for i in {0..3};do echo $i;done
0
1
2
3

4. {string1;string2;...}

  • string을 명령어로 인식하고 현재 쉘에서 실행

5. [...]

  • 배열 변수의 인덱스로 해석

6. [ ... ]

  • test 구문으로 해석

Ⅴ. 변수 탐색


1. glob pattern

패턴설명
?하나의 문자
*공백을 포함한 문자열
[...]안에 있는 문자들 중 하나
[!...]안에 있는 문자들이 아닌것 중 하나
?(pattern)pattern이 0~1번 발생
*(pattern)pattern이 0번 이상 발생
+(pattern)pattern이 1번 이상 발생
@(pattern)pattern이 1번 발생
!(pattern)pattern이 발생하지 않음
`AB`

2. removal

  • 매칭되는 pattern은 반환되지 않음
변수설명
${varname%pattern}non-greedy 후방탐색
${varname%%pattern}greedy 후방탐색
${varname#pattern}non-greedy 전방탐색
${varname##pattern}greedy 전방탐색
jsg@jsg-ubuntu:~$ mynum=1234.56
jsg@jsg-ubuntu:~$ echo ${mynum%.*}
1234
jsg@jsg-ubuntu:~$ echo ${mynum#*.}
56
jsg@jsg-ubuntu:~$ mynum=1234.56.789
jsg@jsg-ubuntu:~$ echo ${mynum%.*}
1234.56
jsg@jsg-ubuntu:~$ echo ${mynum%%.*}
1234
jsg@jsg-ubuntu:~$ echo ${mynum#*.}
56.789
jsg@jsg-ubuntu:~$ echo ${mynum##*.}
789

3. replace

변수설명
${varname/pat/replace}non-greedy 교체
${varname//pat/replace}greedy 교체
${varname/#pat/replace}앞글자를 포함한 패턴 교체
${varname/%pat/replace}뒷글자를 포함한 패턴 교체
${!prefix*} or ${!prefix@}prefix로 시작하는 모든 변수 목록
jsg@jsg-ubuntu:~$ echo $pn
XXX-1234-5678
jsg@jsg-ubuntu:~$ echo ${pn/[0-9]/*}
XXX-*234-5678
jsg@jsg-ubuntu:~$ echo ${pn//[0-9]/*}
XXX-****-****
jsg@jsg-ubuntu:~$ echo ${pn/#[0-9]/*}
XXX-1234-5678
jsg@jsg-ubuntu:~$ echo ${pn/%[0-9]/*}
XXX-1234-567*
jsg@jsg-ubuntu:~$ echo ${!LANG*}
LANG LANGUAGE

변수 종류

변수설명
declare -a어레이
declare -f함수
declare -F함수 리스트
declare -i정수
declare -rreadonly
declare -x환경변수
declare -p변수 리스트
declare +<type>변수 속성 해제

0개의 댓글