article thumbnail image
Published 2022. 8. 29. 17:00

> 문법

- 한글이 깨져서 나올 때

LANG=C
export LANG

 


 

- 변수 선언 및 호출

var1=10
var2="test"
var3=`whoami`

echo $var1		# 10
echo $var2		# test
echo $var3		# root

* 띄어쓰기 하면 오류!

* `(백틱)을 이용하면 명령 실행 결과를 변수에 바로 할당 가능!

 


 

- 특별한 변수

변수 기능
$0 스크립트명
$1 ~ $9 인수, 첫 번째의 인수는 $1, 2번째 인수는 $2로 액세스
$# 스크립트에 전달된 인수의 수
$* 모든 인수를 모아 하나로 처리
$@ 모든 인수를 각각 처리
$? 직전에 실행한 커맨드의 종료 값(0은 성공, 1은 실패)
$$ 이 쉘 스크립트의 프로세스 ID
$! 마지막으로 실행한 백그라운드 프로세스 ID

출처 : https://engineer-mole.tistory.com/200

 


 

- 배열 선언

 array_name_1=("value 1" "value 2" "value 3")
 echo ${array_name_1[@]}  				#print "value 1" "value 2" "value 3"
 echo ${#array_name_1[@]}  				#print "3"

 


 

- 연산자

연산자 의미 예
+ 덧셈 echo `expr 10 + 20` => 30
- 뺄셈 echo `expr 20 - 10` => 10
\* 제곱 echo `expr 11 \* 11` => 121
/ 나눗셈 echo `expr 10 / 2` => 5
% 나머지 echo `expr 10 % 4` => 2
= 자정 a=$b b의 값은 a에 저장된다
== 동일 [ "$a" == "$b" ] $a과 $b가 동일하는 경우 TRUE가 반환된다.
!= 다름 [ "$a" != "$b" ] $a과 $b가 동일하지 않는 경우 TRUE가 반환된다.
비교 의미 예
-eq 동일 [ "$a" -eq "$b" ] 와 $a와 $b가 동일한 경우 TRUE가 반환된다.
-ne 다음 [ "$a" -ne "$b" ] $a와 $b가 동일하지 않은 경우 TRUE가 반환된다.
-gt 보다 큼 [ "$a" -gt "$b" ] $a가 $b보다 큰 경우 TRUE가 반환된다.
-lt 보다 작음 [ "$a" -lt "$b" ] $a가 $b보다 작은 경우 TRUE가 반환된다.
-ge 보다 크거나 같거나 [ "$a" -ge "$b" ] $a가 $b보다 크거나 같은 경우 TRUE가 반환된다.
-le 보다 작거나 같거나 [ "$a" -le "$b" ] $a가 $b보다 작거나 같은 경우 TRUE가 반환된다.
! (이)가 아니다 [ ! "$a" -gt "$b" ]$a가 $b보다 크지 않은 경우 TRUE가 반환된다.
-o 어느쪽이든 [ "$a" -gt "$b" -o "$a" -lt "$b" ]$a가 $b보다 크거나 작은 경우 TRUE가 반환된다. (Bash 확장 / POSIX폐지 예정)
-a 양쪽 [ "$a" -gt 90 -a "$a" -lt 100 ] $a가 90보다 크고 100보다는 작은 경우 TRUE가 반환된다.
-z 문자열이 비었는가 [ -z "$a" ]$a에 어떤 것도 지정되지 않은 경우 TRUE가 반환된다.
-n 문자열이 비었는가 [ -n "$a" ] $a에 어떠한 것이 지정되어 있다면 TRUE가 반환된다.

출처: https://engineer-mole.tistory.com/200 [매일 꾸준히, 더 깊이:티스토리]

 


 

- 조건문 if

if [ ]
then
	....
elif [ ]
then
	....
else
	....
fi



if [ $test == '1' ] && [ $test2 == '1' ]	# 중간중간 띄어쓰기 필수! 아니면 에러도 아니고 그냥 true로 처리됨
then
fi

if [ $test == '1' -a $test2 == '1' ]	# 위에꺼랑 같은 의미

출처 : https://lxstitch.tistory.com/65

 


 

- 자주쓰는 grep 옵션

-i		# 문자열 대소문자 무시
-v		# 문자열 포함된 행 제외

cat "파일이름" | egrep -i "test|test1|test2"	# test or test1 or test2 가 있는 행만 보임

 


 

- SED 명령어

 

 * 치환

sed 's/tset/test/' file.txt		# tset > test로 치환한다

tt=test
echo "test_haha" | sed 's/$tt/kkkk/'		# kkkk_haha


echo "test=100" | sed -n 's/test=\([0-9]\)/\1/p'		# 100

* SED는 원본 파일을 변경하지 않음!

 

https://blog.naver.com/int_s/220483567708

 

01. sed 옵션 정리

- p 명령 : 출력 sed '/north/p' datafile -기본적으로 모든 줄을 출력하고, 패턴과 일치하는 줄을 한번 더...

blog.naver.com

 


 

- AWK 명령어

echo 'root \"roots' | '{print $2}'			# \"roots
echo 'root \"roots' | awk -F"\"" '{print $2}'		# roots


awk '$3==0 {print $3}' /etc/test		# /etc/test 파일의 3번째 인자값이 0이면 출력해라

* -F 옵션은 구분자 변경 (-F다음에 오는게 새로운 구분자, 디폴트는 공백과 탭)

 

awk 'BEGIN{OFS="\n"} {i=1; while(i<=NF) {print $i, i++}}'

* BEGIN{} : 먼저 처리되는 부분

* OFS : 필드 분리자

* NF : 현재 레코드에서 전체 필드 수

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=lge920904&logNo=220648015941 

 

리눅스 awk 변수, BEGIN / END

* 빌트인 내부 변수 ARGC ARGV 배열의 요소 수. 명령라인 아규먼트의 수 ARGV 명령라인 아규먼...

blog.naver.com

 


- For 문

for 변수 in 범위
do
	...
done

* 예) for test in "/etc/passwd" "/etc/shadow" >  /etc/passwd , /etc/shadow 이렇게 두 번 나온다. 파일 내용이 아닌 한 단어로

* 파일 내용으로 설정하고 싶으면 for test in `cat /etc/passwd` 로 짜면 된다.

 



> 팁

- 결과 값 문장에서 첫번째 단어만 뽑고싶다.

result=`ifconfig`
result_1st=`echo $result | awk '$1=="eth0:" {print $1}'`
echo $result_1st			# eth0

* default 는 공백(space bar)으로 구분한다.

* 중간에 if문을 넣을 수도 있다.

 

 

- 중복제거

| uniq
| sort -u	# 중복 제거 후 정렬

 

 

- 파일 권한 검증

ls -al "파일경로" | awk '{print $1}' | grep "...-.--.--"

* -rw-r--r--

. . . - . - - . - -
- r w - r - - r - -


... = 문자열 3개

- = 문자열이 들어가면 매칭x, 즉, 4번째 자리에 - 가 있다는건 user의 실행권한이 없어야 매칭된다는 것

...-.--.-- = user 실행권한 x, group 쓰기 및 실행권한 x, other 쓰기 및 실행권한 x 인것 들을 매칭 시키겠다.

 

 

- command not found 에러

윈도우에서 .sh 파일을 짤때 흔히 나오는 에러이다.

윈도우랑 유닉스랑 띄어쓰기 인식이 다르기 때문에 생기는 오류이다.

.

 

notepad++로 .sh 파일을 연 후 파일 맨앞에 아래와 같은 문구 추가한 후 Windows (CR LF) > Unix (LF) 로 바꾼 뒤 저장!

#!/bin/bash

 

 

- 스크립트 에러 시 디버깅 하는방법

sh -x [쉘스크립트] > shell_debug.txt
복사했습니다!