1. 스크립트 구축의 기초
스크립트 파일 작성하기
뒤에 확장자 .sh를 붙여주어야 구별하기 쉽다. 사실 안해도 되기는 한데 vim이 얘가 무슨 파일인지 인식못해서 색깔 대충넣어주니 해주자
touch a.sh ; chmod 755 a.sh
대충 위처럼 적어주면 된다.
중요한건 최상단에 #!/bin/bash를 적어주자. 매직쿼터라는 건데 bash 쉘의 명령어를 쓴다는 말이니까
메시지 표시하기
echo
변수 사용하기
쉘에서는 모든 것을 문자로 인식하고 상황에 맞추어서 숫자로도 인식함
쉘에서 모든 변수는 전역변수임
쉘에서 지역변수는 local을 앞에 붙여야함
암튼 이런상황이다보니 함수안에 선언된 변수는 죽지도 않고 살아있는등 메모리 효율성에서 병신같지만.... 짜피 쉘에서 하는거라 메모리 사용이 그렇게 크지는 않을듯
- 선언방법/사용방법
# 선언하기
변수명="변수값"
변수명=변수값
# 사용하기
변수명="변수값" #가급적 이 방식 그대로 사용하자
echo ${변수명} #가급적 이 방식 그대로 사용하자
# 지역변수
local 변수명=변수값
기본 모든 자료형을 문자열로 받아들인다
정말 무슨 일이 있어도 변수는 중괄호를 써줄 필요가 있다.
함수내에서는 local, 중괄호 필수이다.
- 시스템 환경변수
사용자가 로그인하여 해당 시스템에 진입했을 경우 기본적으로 제공되는 변수이며 시스템내의 어느 곳으로 이동하더라도 동일한 변수명을 사용할 수 있는 전역변수(global)로 사용된다.
echo $USERNAME
echo $HOSTNAME
echo $PATH
- 위치 매개변수
- 특수 매개변수
Bash 입문자를 위한 핵심 요약 정리 (Shell Script) - 개발자스럽다 (gaerae.com)
가장 중요한건
$? ->
$# -> 매개변수 갯수
계산 수행하기
expr, bc가 있기는 한데 병신임
걍
(( )), [ ] 로 끝난다.
+ (( )) 안에서는 변수명에 $ 안붙여도 됨
+ 숫자만 연산/삽입이 가능
a=1
b=2
c=(( a + b ))
(( c = a + b ))
d=$[ $a + $b ]
그럼에도 계산시 (( )) 사용을 비추하는 이유는 에러가 날 가능성이 높고 for문에서 쓰는 것이 보다 좋기 때문이다.
정리
$() -> 명령실행(``)
그냥 명령어 -> 명령실행
$[] -> 계산하기(expr, bc)
(( )) -> 계산하기, 가급적 for문에서만 쓰자
[ ] -> if문과 while문 조건에 사용
${} -> 변수구분용
" " -> 입력된 내용 그대로 변수로 사용
2. 구조적 명령 사용하기
if-then 구문 사용하기
조건문 이거임
if []
then
elif
else
fi
이때 뒤에서 나오는게 귀찮아서 조건부분 더 이야기 해보자면
$? -> 이전에 쓴 명령이 실행성공되었는지 알려줌
[ ] -> 이건 숫자/문자 조건용 + 변수 연산용으로 사실상 만능임. 하지만 연산용으로 쓰기 불편하다는 단점이 있음. 변수도 꼭 $를 붙여야함. 나는 가급적 문자 조건용으로 사용할거 같음
연산용으로 쓸떄는 $[ ]으로 해서 내부에 연산할 변수들을 넣어주고 결과는 `변수명=`으로 넣어주면 된다.
[[ ]] -> [ ] 기능에 추가적으로 정규식을 비교할 수 있게 해줌. bash에서만 사용가능하기에 불편함
(( )) -> 이건 숫자 연산용으로 쓰기 때문에 중요함. 단, 조건용으로 쓸수는 있지만 숫자만 판별할 수 있음. for문에서 주로 사용할거 같음. 나는 가급적 for문 쓸때만 쓸거 같음
(( i=0 ; i<3 ; i++) 가능
let -> 이건 그냥 숫자 용으로만 쓰는거, 나는 잘 안쓸듯
- 조건연산자
= | -eq | |
!= | ||
> | -gt | |
< | -lt | |
>= | -ge | |
<= | -le | |
-n str1 | str1의 길이가 0보다 큰 지 검사 | 특 변수에 " " 로 감싸주지 않으면 에러남 |
-z str1 | str1의 길이가 0인지 검사 | |
그외에 안쓸거 같지만 일단 적는것들 | ||
-d file1 | file1이 있고 해당 file1이 디렉토리면 참 | |
-e | 해당 파일/디렉토리가 존재한다면 참 | |
-f | 해당 파일이 있다면 참 | |
-r | 파일이 있고 읽기 가능하다면 참 | |
-w | 파일이 있고 쓰기 가능하다면 참 | |
-x | 파일이 있고 실행 가능하다면 참 |
test 명령
이게... 조금 이상한거긴 한데 일단 알아보자
일단 bash shell에 복합 비교연산자를 쓸려면 무조건 (( ))으로 처리해주어야한다.
[ ] 으로 숫자를 비교하려면
-eq, -ge, -gt, -le, -lt, -ne을 써야한다.
문자를 비교하려면
=, !=, <, >, -n(길이 검사해서 0보다 큰지), -z(길이가 0인지)
이렇다보니 문자가 조건일때는 [ ] 을 사용해 -eq, -ge, -gt, -le, -lt, -ne, -n(길이 검사해서 0보다 큰지), -z(길이가 0인지)를 사용하여 문자를 비교해주고
(틀린생각) -> 숫자가 조건일때는 (())을 사용해 ==, <=, >=, <, > 을 사용해 비교해주는게 덜 헷갈리다
복합 조건 테스트
&&
||
사용가능
이중 대괄호 및 괄호 사용하기
if [ ] 안쓰고 if (( )) 으로 처리하는 방법 나쁘지는 않은데 문자는 사용불가하다는 게 단점이라 나는 잘 안씀
case 구문보기
case $USER in
rich | babarian)
echo ;;
testing)
echo
echo ;;
*)
esac
케이스 - 이삭 이라는 거다. 메뉴를 만들때 쓴다.
3. 구조적 명령 더 알아보기
1) for 문으로 되풀이하기
# 기본사용
# "" 혹은 ''를 하나의 문자열로 봄
# '를 쓰려면 "" 안에 쓰면된디
for test in Arizona Boston "Yeah Ahh" "I don't think so"
do
echo $test
done
# 문자열 변수 사용하기
list="Arizona Boston Detroit"
list=$list" Houston"
for state in $list
do
echo $state
done
# 명령어 실행결과 읽어오기
for user in $(ls /etc/passwd)
do
echo $user
done
# 필드 구분자 IFS
IFS=:/ # :와 /를 기준으로 데이터 구분
for file in /root/*
do
done
2) while 문 사용하기
3) until 문으로 되풀이하기
4) 루프 결합하기
5) 루프 출력 리다이렉트하기
4. 사용자 입력 처리
1) 매개변수 전달하기
2) 매개변수 추적하기
3) 시프트 기능 확용하기
4) 옵션 다루기
5) 옵션 표준화하기
6) 사용자 입력 얻기
----
5. gawk
gawk은 기본적으로 앞에 무언가가 있고 파이프라인 연결하거나 혹은 맨 뒤쪽에 읽을거 적어야함 아니면 작동안함
#IFS 설정
gawk -F: /etc/passwd
# 그냥 출력
gawk '{print "HI"}'
#파일 gawk 명령어 읽기
gawk -f user.gawk /etc/passwd
# gawk으로 처음과 끝 표현
gawk 'BEGIN {print "시작"} {print $4} END {print "끝"}' sample.txt
#정규 표현식
## ?
echo "bt" | gawk '/be?t/{print $0}' # ?바로 앞의 e가 없거나 딱 한번있는지 확인
echo "bt" | gawk '/b[ae]?t/{print $0}' # ?바로 앞의 a 또는 e가 없거나 딱 한번있는지 확인
## +
echo "bt" | gawk '/b[ae]+t/{print $0}' # + 바로 앞에 a 또는 e가 한번이상있는지 확인
## {}
echo "bt" | gawk '/b[ae]{1}t/{print $0}' # a 또는 e가 딱 한번 출력하는지 확인
echo "bt" | gawk '/b[ae]{1,5}t/{print $0}' # a 또는 e가 딱 한번 이상 5번 이하 출력하는지 확인
## |
echo "my dog is ..." | gawk '/[ch]at}|dog/{print $0}' # or 연산
## [], ^, &
echo "bt" | gawk '/[a-z0-9]{1,5}/{print $0}' # a-z, 0-9 사이 문자들이 1이상 5이하로 있는지
echo "bt" | gawk '/^[a-z0-9]{1,5}$/{print $0}' # 정규 표현식
사용자 입력처리
매개변수
#!/bin/bash
$# -> 들어온 매개변수 수 확인
$1 $2 $3 -> 들어온 매개변수 순서대로 사용
$? -> 수행결과로 결과가 나올때까지 대기탐
if [ $# -ne 3 ]
then
echo "잘못된 입력입니다"
echo "./db2.sh 번호 이름 지역"
else
comm="INSERT INTO student VALUES ('$1', '$2', '$3')"
mysql school -u user1 -puser1 << EOF
$comm
EOF
if [ $? -eq 0 ]
then
echo "데이터 입력에 성공하였습니다"
else
echo "데이터 입력에 실패하였습니다"
fi
fi
시프트 기능
옵션
사용자 입력
DB
mariadb, mysql
yum -y install mariadb-server
# 확인 및 시작
systemctl status mariadb
systemctl restart mariadb
# 환경설정
mysql_secure_installation
패스워드는 test123으로
Remove anonymous users : 익명 사용자 지우기
Disallow root login remotely : 다른 PC 접속 막기
Remove test database and access to it : test db없애기
# 로그인
mysql -u root -ptest123
#### DB관리 ####
# DB 전체보기
show databases;
# DB 생성
CREATE DATABASE school;
# 유저 생성 + DB 권한 부여
GRANT ALL PRIVILEGES ON school.* TO user1@'localhost' IDENTIFIED BY 'user1';
# DB 이용
use school;
# 테이블 전체 보기
desc student;
#### 쿼리 ####
# 테이블 생성
CREATE TABLE student (
-> number int not null,
-> name varchar(20),
-> address varchar(20),
-> primary key (number));
show tables
INSERT INTO student VALUES (1111, 'tonyhan', 'Mapo');
select * from student;
중간에 이름 체크하는 부분이 -z "$vmname" 으로 되어 있는 것을 확인할 수 있다. 이건 그냥 한게 아니다. DB에서 데이터를 받아오면 그게 테이블 형태로 오다보니 행과 값이 함께 들어온다. 그래서 에러가 위와같이 두개이상의 인자가 들어온다는 에러가 뜬다. 이걸 해결하기 위해서는 ""를 감싸준 것이다. 조건문 변수를 쓸때 이렇게 하는 게 좋아보인다.
이게 힘들다면 [[ -z $vmname ]] 을 써도 되기는 한다.
$(( )) 로 묶여야 내부의 변수는 $없이 쓰고 동시에 변수로 사용할 수 있어짐
?는 이전 명령의 수행결과를 받아온다. 다른말로 수행결과를 받기 전까지 프로그램이 잠시 멈춘다.
BASH - mariadb, mysql
#쿼리 던지기 + 에러 처리
mysql school -u user1 -puser1 -h localhost -e 'select name as '이름', address as '주소'
from student where number='$num'' 2>/dev/null
# 위의 방식으로 하면
# STDIN(0), STDOUT(1), STDERR(2)의 출력 결과를 /dev/null이라는 아무 입력이나 받는 곳에 던짐
# 두개 이상의 쿼리 던지기
mysql school -u user1 -puser1 -t <<EOF
> desc student;
> select * from student;
> EOF
command line - What does 2>/dev/null mean? - Ask Ubuntu
6. 함수만들기
배열
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
7. 텍스트 메뉴 만들기
'Development(Web, Server, Cloud) > Cloud : 정리' 카테고리의 다른 글
4. Cloud 네트워크 (0) | 2022.02.08 |
---|---|
3. GCP와 AWS (0) | 2022.01.18 |
1. 클라우드와 가상화를 위한 리눅스 7.0 : VMWare 네트워크, CentOS7, vi, disk, 사용자와 그룹, 추가적인 작업, DNS서버, 웹서버, NFS서버, 클라우드 가상화, KVM, Docker, SELinux (0) | 2022.01.18 |
CloudPublicCloud : AWS, GCP, AZURE, 공통 (0) | 2022.01.16 |
CloudWeb : StarterPack (0) | 2022.01.15 |