Linux/Shell_Script

RANDOM

2017. 12. 14. 08:17

#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

Linux/Shell_Script

case

2017. 12. 14. 08:08

#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면 뒤를 안본답니다.



'Linux > Shell_Script' 카테고리의 다른 글

RANDOM  (0) 2017.12.14
for과 while  (0) 2017.12.14
Shell Script 뭉텅이  (0) 2017.12.14
우리의친구_Bash  (0) 2017.12.14

Linux/Shell_Script

for과 while

2017. 12. 14. 07:08

# 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



'Linux > Shell_Script' 카테고리의 다른 글

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









  





'Linux > Shell_Script' 카테고리의 다른 글

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번째 명령

    !문자열 ) 주어진 문자열로 시작하는 명령중 제일 최근 명령


요기까지 정리하였다

쉘 스크립트가 더 이해잘되기위해 기초를 다졌으니 이제 쉘 스크립트를 만나보자!

 

   










'Linux > Shell_Script' 카테고리의 다른 글

RANDOM  (0) 2017.12.14
case  (0) 2017.12.14
for과 while  (0) 2017.12.14
Shell Script 뭉텅이  (0) 2017.12.14