> 문법
- 한글이 깨져서 나올 때
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 |

- 배열 선언
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' ] # 위에꺼랑 같은 의미

- 자주쓰는 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) 로 바꾼 뒤 저장!

- 스크립트 에러 시 디버깅 하는방법
sh -x [쉘스크립트] > shell_debug.txt'ETC' 카테고리의 다른 글
| ZAP 사용하기 (feat. burp와 장단점 비교) (0) | 2022.12.26 |
|---|---|
| [개발] 로또 1등 확률 5%로 높이는 앱 만들기 (0) | 2022.09.23 |
| BAT 파일 문법 및 주의사항 (0) | 2022.08.29 |
| Window10 포맷 시 복구할 이미지 만들기 (Window 이미지 백업) (0) | 2022.06.11 |
| python 3.x 버전과 2.x 버전 같이 사용하기 (0) | 2022.04.22 |