#RANDOM
a=$RANDOM % n
0~n-1
예시 ) let " die1 = RANDOM % $PIPS "
'Linux > Shell_Script' 카테고리의 다른 글
case (0) | 2017.12.14 |
---|---|
for과 while (0) | 2017.12.14 |
Shell Script 뭉텅이 (0) | 2017.12.14 |
우리의친구_Bash (0) | 2017.12.14 |
#RANDOM
a=$RANDOM % n
0~n-1
예시 ) let " die1 = RANDOM % $PIPS "
case (0) | 2017.12.14 |
---|---|
for과 while (0) | 2017.12.14 |
Shell Script 뭉텅이 (0) | 2017.12.14 |
우리의친구_Bash (0) | 2017.12.14 |
#case
포맷 )
case "$var" in
"$condition1" )
commands.. ;; : break 역할
....
* ) : default 역할
esac
< condition >
[a-z] ), [a-zA-Z]* 와 같이 정규표현도
"E"|"e" ) 와 같이 or도
$2와 같이 파라미터도 가능
#Select
PS3 = select 순간에 나올 구문
1 : a 이렇게 선택하도록 나오고
숫자를 선택하면 var에는 그 숫자에 해당하는 값이 저장된다.
포맷 )
select var in list
do
~~
break : 안 넣으면 무한루프 ..
done
예시 )
select var in "a" "b" "c"
~~
@choice_of : 이런방식으로도 가능
choice_of()
{
select var
do
~~
break
done
}
choice_of a b c
# 함수 : 파이썬처럼 만들면 되는데 def가 없다고 생각
func 매개변수 -> 인자 전달이 된다.
# [ $# -eq $PARAMS ] || return $BAD_PARAMS
이렇게 앞의 조건이 false이면 뒤를 실행하게
or 의 특징이 앞에 조건이 true면 뒤를 안본답니다.
RANDOM (0) | 2017.12.14 |
---|---|
for과 while (0) | 2017.12.14 |
Shell Script 뭉텅이 (0) | 2017.12.14 |
우리의친구_Bash (0) | 2017.12.14 |
# Cf. 배열
Q[0]=1 이렇게 한번의배열이 생성되면서 부터
Q[1]=2 , echo ${Q[1]} 이렇게 사용가능
@ list = ( a b c d ) 이런 경우
@list:n =a의 n번째부터 공백까지의 값
@${#list[*]} or ${#list[@]}
list 내 원소 개수 ( ""도 하나로 침 )
@( [index]=value [index]=value )
이 방식으로 해당 인덱스내의 값 대입이 가능하다.
@declare -a arr
이러한 방식으로 배열 선언 가능
read -a arr
이러한 방식으로 배열에 값 대입 가능 오옹
@ ${arr[@]} or ${arr[*]} --> 데자뷰 $@, $*
해당 배열내 원소 모두 출력
# for
포맷 1 : list 안 값들이 var에 대입된다.
for var in list
do
~
done
@ list
1 2 3 4 5 6 7 8 9
paper pencil pen
* <- 쉘 명령으로 해당 디렉토리내 파일
ls -l등의 명령
[j]* -> j를 포함한 파일 목록
`seq $cnt` : 1~cnt까지 출력
"1 2 3 4" 이렇게 하면 리스트가 될 수 있다.
포맷 2 : 우리가 많이 쓰던 방식의 for
for ((초기식; 조건식; 증감식))
do
~
done
@ 초기식, 증감식에 여러 식이 들어갈 수 있다. , 로 구분해준다.
# while
포맷 1
while [ condition ]
do
~
done
@ condition 할때 "$var" 이렇게 왠만하면 해주더라
포맷 2
while (( condition ))
do
~
done
RANDOM (0) | 2017.12.14 |
---|---|
case (0) | 2017.12.14 |
Shell Script 뭉텅이 (0) | 2017.12.14 |
우리의친구_Bash (0) | 2017.12.14 |
하늘에는 별똥별이 떨어지고 있단다.
내 성적도 같이 떨어지면 안되므로 나는 쉘 스크립트 공부를 시작한다 ㅠ.ㅠ
# " #!/bin/bash " 를 앞에 써주는 이유
쉘 의존적으로 작동하는 것이기 때문에 해당 쉘을 사용함을 명시해놓는 것이다.
# 입력 받고 출력하고
1 ) read : 입력을 받는 바이너리
@ ( 예시 ) read x : 입력을 받고 x에 저장
@ 연속적으로 입력 받는 것도 가능
( 예시 ) read x y : 공백으로 구분하여 순차적으로 값이 들어간다.
@ ( -p ) 입력을 받을 때 출력할 안내문구
( 예시 ) read -p " 숫자 2개 입력 " x y
2 ) echo : 출력을 하는 바이너리, 저번 글에서 나온 쉘 특수문자들 적극 활용!
@ ## : 그 이전의 것 제거 , *까지면 모두
${PWD##*/} : / 이후의 마지막 것
${filename##*.} : . 이후의 마지막 것 : 확장자가 되는 원리
@ -n : 개행 없이 출력
# 수식 연산
+, -, *, / 동일하며 %는 모듈러 ( 나머지 ) 연산이다.
** 은 승수 연산이다 . 즉 2**3 = 8
@ 승수연산을 제외하고 다 복합대입 연산자가 있다.
** 나머지 연산시 소수점 이하는 버림 현상이 일어난다. **
** 해당 현상의 취하를 위해서는 |bc를 사용한다. **
** 예 ) x=`echo "$x + $y"|bc` **
expr, let, (( ))을 사용
(( ))
예시 (($n1+$n))
장점: 띄어쓰기에서 자유롭다, 특수문자를 마음대로 사용가능하다.
특징: 값을 사용하고 싶을땐 $(())을 이용한다.
let
bash만 가능
우분투는 sh가 dash라 불가능 ..
장점 : 복합대입연산자 사용시 좋다.
expr
예시 `expr $n1 + $n2`
쉘 스크립트 실행할때 계산 결과가 치환되는 느낌
0으로 나눌때 경고문 까지 띄어주고
expr $n1 "$op" $n2 로 입력해도 알아서 작동할 정도로 좋은 녀석
** int 범위 초과시 error **
# 비트 연산
<< : 1110 이 11100 이된다. 즉 2를 곱하는것과 동일해진다.
>> : 1110이 0111이 된다. 즉 2로 나누는것과 동일해진다.
&, | : or, ^ : xor
# Shell 변수
${#var} : 변수안 내용의 길이
${var/str1/str2} : str1을 str2로 변경
2334 + 1 = 2335
2334가 BB34로 바뀌면 1을 let의 복합대입이용시 "1"이되버림
# Shell 환경변수
쉘 스크립트가 시작 될 때 일부의 변수들이 환경의 값을 통해 초기화된다.
이들을 환경변수라고 한다.
$HOME
현재 사용자의 홈
$PWD
현재 디렉토리
Print Working Dir
`basename $PWD` : 딱 현재 디렉토리 명만 가져 올수 있다.
$PATH
명령받은 것에 해당하는 바이너리를 찾는 경로들 ':'로 구분되어 있다.
$PS1
$인 프롬프트 ( 1차 프롬프트 )
$PS2
추가적인 입력을 요구시 사용 ( 주로 '>' )
$IFS
입력 구분자
입력을 받아들일시 구분하는 단위
기본 : 빈칸, 탭, 새줄문자
$0
해당 쉘 스크립트의 이름 ( 확장자 포함 )
`basename $0` : 진짜 파일이름만
안쓰면 만약에 sh d/t.sh로 실행시 d/t.sh가 출력된다.
$#
전달된 파라미터의 수 ( 아무것도 없을시 0 )
@ E_NO_ARGS=65, exit $E_NO_ARGS : 요런 식으로 아무것 도 없을시
에러메시지를 보내고 종료가 가능
$$
해당 쉘 스크립트의 프로세스 ID ( PID )
@ declare -i : 정수로 선언
# Shell 파라미터 변수
스크립트가 파라미터와 함께 호출될 때
몇가지 추가적인 변수가 생성되는데
이를 파라미터 변수라 한다.
$1, $2 .... ${10}
각각 번째의 주어진 파라미터, 10부터는 괄호로 감싸주어야한다.
$*
IFS의 첫 문자로 구분, 모든 파라미터의 목록
$@
$*와 같지만 IFS의 영향을 받지 않고 공백으로 구분한다.
** #과 결합시 ${#@} 이렇게 사용 **
until [ -z "$1" ] do shift done
while과 같은 구조, 매개변수를 다 쓸때 까지 돌아가게 된다.
# If - Else
구조 )
if condition
then
statement
elif condition
then
statement
else
statement
fi
@ if condition과 then을 같이 쓰기 위해선 condition 다음 ;을 붙인다.
@ if fi 열고 닫는 구조 !
# Shell Boolean
조건함수와 같이 쓰여 기본형으로 test , 축약형으로 []를 사용한다.
예시 ) test -f ==> [ -f ]
어떤 논리 연산, 파일의 조건 연산 후 그에 대한 참 / 거짓 결과를 리턴한다.
0 ) true / false ( ! true ) // 여기도 공백 준거 보이지?
쉘에서 true = 0이고 false = 1 이다.
$? ) 이전 명령의 상태
true
echo $?시 0이 출력된다.
초기화 되지 않은 상태를 제외하고 모두 true 즉 [ ]도 [ xyz ]도 ( xyz는 일종의 문자열 )
[ $xyz ]하면 초기화안된 변수이므로 false
음 [ 1 ] 은 true 고 [ ! 0 ] 은 false
1 ) 비교 연산자
( 1 ) 문자열 비교
[ $string ]
string이 빈 문자열이 아니라면 참
= 과 != 통한다. ( !!! 단! 띄어쓰기를 해주어 값의 대입과 구별시킨다. )
[ -n $str ]
str이 null ( 빈 문자열 )이 아니라면 참
No Null
테스트를 기준으론 $1이 입력 받지 않아도 TRUE가 되버리는 현상이 발견되었다.
이를 방지하기 위하여 "$1" 이런식으로 사용하자.
[ -z $str ]
str이 null ( 빈 문자열 )이라면 참
안 넘어 왔을시 exit $POS_PARAMS_MISSING 을 이용하여 에러 메시지를 출력하자
Q. str=""일때 -n와 -z에서 모두 참이 리턴되었다. 왜일까?
( 2 ) 산술 비교
[ expr -option expr ]
-eq : Equal
-ne : Not Equal
-gt : Greater
-ge : Great + Equal
-lt : Less
-le : Less + Equal
( 3 ) 논리 연산
[ ! expr ] : 참/거짓 반전
** !과expr사이에 공백 필수 **
[ expr -option expr ]
-a : and연산
-o : or 연산
기존의 방식이 더 편하다면 그대로 쓸 수는 없고
[ expr ] && [ expr ] 과 같이 가능하다.
혹은 [[expr && ]] 과 같이 쓰면된다.
2 ) 파일 조건 연산자
( 1 ) 파일 형태
[ -d FILE ] : FILE이 (1)디렉토리형태로 (2)존재하면 참
[ -f FILE ] : FILE이 디렉토리가 아닌 형태로 존재할때 참
[ -e FILE ] : FILE이 어떤 형태로든 존재하면 참
[ -L FILE ] : FILE이 소프트링크 ( 심링크 ) 일때 참
** 참고로 하드링크는 -h **
( 2 ) 파일 내용
[ -s FILE ] : FILE이 비어있지 않으면 참
( 3 ) 파일 권한 / 소유
[ -r/w/x FILE ] : 현재 사용자가 해당 권한을 가진 파일이면 참
[ -O FILE ] : 현재 사용자가 파일의 주인일시 참
** O , o가 소문자일땐 명령이 안 먹는다, 대문자로 !! **
( 4 ) 파일 비교
[ F1 -nt F2 ] : F1 이 F2보다 최근 파일일때 참
newer than
[ F1 -ot F2 ] : F1 이 F2보다 오래된 파일일떄 참
older than
( 5 ) 파일의 관계
[ F1 -ef F2 ] : 하드링크 관계일때 참
equal file
RANDOM (0) | 2017.12.14 |
---|---|
case (0) | 2017.12.14 |
for과 while (0) | 2017.12.14 |
우리의친구_Bash (0) | 2017.12.14 |
새벽감성으로 공부중이다 ㅎ..
쉘 스크립트를 공부하기에 앞서서 쉘스크립트가 작동할 Bash에 대하여 먼저 알아볼 것이다.
# Shell 메타문자
쉘은 아래와 같이 일부 특수문자를 특별하게 인식하여 처리한다.
* : 임의의 문자열 ( 한문자 이상 ), ? : 임의의 한문자, [] : 대괄호안 포함된 문자 중 하나
이 특수문자들은 자신이 파일명을 일부만 알고있거나 파일명이 너무 길어 귀찮을때 유용하다.
@ []안에 문자를 쓸때 a~z까지를 다 쓸필요없이 a-z와 같이 축약가능하다.
@ * []?와 같이 혼합사용이 가능
~ : Home, - : Last Dir
이 특수문자들은 작업공간의 이동시 유용하다.
@ cd - 시 이전 디렉터리 명을 출력하고 이동한다.
; : 한번에 왼쪽부터 차례로 여러개의 명령을 수행
| : 왼쪽 명령의 결과를 오른쪽 명령의 입력으로 전달
` ` : 쉘 명령 수행
이 특수문자는 echo와 유용하게 쓰인다.
예시 ) echo ` expr 4 + 5 ` : expr 명령을 수행후 결과를 출력한다.
' ' : 모든 쉘의 특수문자 무시, " " : $, `, \를 제외한 모든 쉘 문자 무시
이 특수문자들은 쉘이 특수문자를 그 자체로 쓰도록 하는 역할을 한다.
쓰이는 곳은 역시 문자출력이다.
예시 ) echo ' ** Hello ** '
만약 ' ' 없이 echo ** Hello **를 친다면
당신은 해당 작업공간내에 모든 파일 및 폴더를 구경하게 될 것이다. ( 궁금하면 ㄱㄱ )
예시2 ) echo " ** `expr 4 + 5` ** "
\ : 특수문자를 이스케이프 시퀸스로 작동 ( 즉 ', " 없이도 특수문자로 구별되게 가능 )
예시 ) echo \*\*
>, >>, <, 2> : 입출력 장치의 변경
키보드로 표준 입력 ( stdin )을 받으면 명령이 실행된 후
모니터에 표준 출력 ( stdout ) 혹은 표준 오류 ( stderr )를 출력하는게 일반적이다.
< : 키보드 입력 대신 파일의 내용을 입력 ( 입력 리다이렉션 )
> ( or 1> ), >> : 모니터대신 파일에 내용을 출력
@ 둘의 차이점
> : 기존파일의 내용을 없애고 작성
>> : 기존파일이 있을시 append ( 끝에 내용 추가 )방식으로 작성
2> : 에러 메시지를 모니터 대신 파일에 입력한다.
@ 2>&1 : stdout과 stderr를 한 파일에 들어놓음
# Shell 변수 설정
1 ) 쉘 변수와 환경 변수
쉘 변수 : 현재의 쉘에서만 사용 가능한 변수
@ 변수=값 ( 공백까지 일종의 문자로 인식하므로 띄어쓰기는 하지말자 )
@ 변수에 저장될 문자열이 빈 칸을 포함한다면 " "으로 감싸서 대입한다.
@ 변수에 초기 값을 대입하는 시점에 변수가 생성된다.
@ 모든 변수의 타입은 문자열로 간주된다.
@ 확인 명령 : set
@ 쉘 변수는 관례상 대문자를 사용
@ 변수는 대소문자를 구분한다. ( 즉 A와 a는 다른 변수 취급 )
환경 변수 : 모든 쉘에서 사용 가능한 변수
@ 확인 명령 : env
@ export 변수=값 , 변수=값 + export 변수
2 ) 변수 값 확인
전체적으로 확인시 set, env를 사용
변수명을 이용하여 확인시 $을 이용
예시 ) echo $day
3 ) 변수 정의 해제
unset 변수명
# Shell의 여러가지 기능들
1 ) alias : 별칭 만들기
@ alias 별칭=명령 : 설정
@ unalias 별칭 : 해제
@ alias : 설정값 확인
2 ) fc : 사용자가 입력한 명령을 기록하여, 재사용 하도록 함
@ 히스토리 목록에서 선택하는 방식
@ 옵션
-s ) 최근 명령을 재실행
-l ) 이전 명령 목록 확인
@ 확인시 번호와 함께 입력한 명령이 출력된다.
@ 명령 재실행
!! ) 마지막 명령 실행
!n ) 번호번째 명령 실행
!-n ) 현재 명령에서 뒤에서 n번째 명령
!문자열 ) 주어진 문자열로 시작하는 명령중 제일 최근 명령
요기까지 정리하였다
쉘 스크립트가 더 이해잘되기위해 기초를 다졌으니 이제 쉘 스크립트를 만나보자!
RANDOM (0) | 2017.12.14 |
---|---|
case (0) | 2017.12.14 |
for과 while (0) | 2017.12.14 |
Shell Script 뭉텅이 (0) | 2017.12.14 |