export / set / unset / declare / typeset

markyang92·2021년 5월 31일
1

shell-script

목록 보기
7/19
post-thumbnail

Variable

  • 변수 이름은 알파벳(대,소 구분), 숫자, _로 만들 수 있다.
  • 첫 문자로 숫자가 올 수 없다.
  • 생성한 변수는 서브 쉘, source 스크립트 내에선 별다른 설정 없이 사용할 수 있다.
    • child process 에서 사용하려면 export 해야한다.

선언 및 사용

  • 처음에 선언으로는 커맨드가 사용되지 않는다.

export: for child-process

  • child process (bash -c "CMD") 에서 사용하려면 export 해야한다.
  • export를 붙이지 않으면 지역 변수라, 해당 쉘만 사용할 수 있다.

서브쉘은 자동 inherited


export

  1. 변수 AAexport AA 해야 child process 에서 사용할 수 있다.

1-1. 해결 방법
부모 프로세스에서 export 해야 child process 에서 사용 가능
export AA


export [option]

export VAR

  1. 단순 변수 export
  • export VARIABLE
$ export 변수명
$ declare -x 변수 명

==== Parent shell ===
AA=100

export AA
or
declare -x AA

export -f FUNC

  1. 함수 export: -f option
  • export -f FUNCTION_NAME
  • child process에서 함수를 사용할 경우 함수내 모든 변수도 export 해야한다.

export -n VAR: 취소

  • 변수 export 취소
$ export -n 변수명
  • export 취소삭제는 다름!!!!!
    • 취소는 말그대로 export를 취소하는 것이지 변수를 제거하는 것은 아님!
      • export -n VAR
    • 삭제는 말 그대로 변수를 제거
      • unset -v VAR

declare -p VAR: VAR가 환경변수 인지 확인

  • 변수export 되어 있는지 확인
$ declare -p 변수


e.g.
$ AA="100"

$ declare -p LANG		# LANG 변수가 export 되어 있니?
declare -x LANG="en.UTF-8"	# 출력에 'x'가 있으면 export 되어 있음


$ declare -p AA
declare -- AA="100"		# 출력에 'x'가 없으면 export된 변수는 아님

export -p: 모든 환경 변수 출력

  • 현재 export모든 변수 출력
$ export -p

set

  • set: 모든 변수와 함수 출력
$ set

set VAR: 로컬변수

set VAR=VALUE
  • set 명령
    • set 명령의 값은 SHELLOPTS 변수에 있다.
    • local
    • 환경 변수의 1)일반적인 유형, 2)사용자 또는 사용자의 쉘이 이용하기 위한 정보
    • rule은 소문자로 작성
#!/bin/bash

set test="testing"
  • set의 scope

미리 정의된 환경변수

ENVDescription
HOME사용자의 홈 디렉터리
PATH실행파일을 찾는 경로
LANG프로그램 사용 시 기본 지원되는 언어
PWD사용자의 현재 작업하는 디렉터리
TERM로그인 터미널 타입
SHELL로그인해서 사용하는 쉘
USER사용자의 이름
DISPLAYX 디스플레이 이름
VISUALvisual 편집기의 이름
EDITOR기본 편집기의 이름
COLUMNS현재 터미널이나 윈도우 터미널의 컴럼 수
PS1명령 프롬프트 변수
PS22차 명령 프롬프트. 명령 행에서 사용하여 명령 행을 연장 햇을 때 나타냄
BASH사용하는 bash 쉘의 경로
BASH_VERSIONbash의 버전
HISTFILEhistory 파일의 경로
HISTFILESIZEhistory 파일의 크기
HISTSIZEhistory에 저장되는 갯수
HISTCONTROL중복되어지는 명령에 대한 기록 유무를 지정하는 변수
HOSTNAME호스트의 이름
LINES터미널의 라인 수
LOGNAME로그인 이름
LS_COLORSls 명령의 색상 관련 옵션
MAIL메일을 보관하는 경로
MAILCHECK메일 확인 시간
OSTYPE운영체제 타입
SHLVL쉘의 레벨
TERM터미널 종류
UID사용자의 UID
USERNAME사용자 이름

환경변수 출력

  • env, printenv현재 설정된 환경 변수STDOUT으로 출력함
  • echo ${ENV_VARIABLE}: 특정 ENV_VARIABLE을 echo로 STDOUT으로 출력함

변수 재활용 시 local 잘 사용할 것

  • local 을 사용하지 않고 그냥 WORKING_DIR을 사용하면, 각 함수 내에서 선언한 변수라도 서로 영향을 준다.
  • 변수 재활용 때는 주의!

unset

  • unsetBash 쉘 변수 설정 해제
$ unset VAR # 변수 VAR를 unset 시도하고, 실패할 경우 함수 VAR를 unset 시도한다.
$ unset -v VAR


declare, typeset

  • 원래 변수 type 지정 필요없지만 필요할 때도 있겠지? 그 때, declare, typeset 를 사용한다.
  • 사용법

declare -r: readonly

  • -r : 읽기전용으로 선언

    -r옵션을 주면, 읽기 전용으로 선언되고 C에서 const qualifier와 비슷하며, 이 변수의 값을 바꾸려하면 에러 메시지가 난다.

declare -i: 정수

  • -i: 정수
    이후 나오는 모든 number를 정수로 취급한다.



    에러 유발

declare -A: associative 배열

  • assosiative array를 선언함
declare -A arr

declare -f: 함수

$ declare -f [function_name]
  • -f: 함수
    • -f, 인자 없음
      스크립트안에서 정의된 모든 함수들의 목록을 보여준다.
    • -f function_name
      그 함수 이름 보여줌

declare -x == export

$ AA=100
$ export $AA

-- 같은 역할 --
$ declare -x AA=100
  • -x: export 역할
    외부 환경에서도 이 변수를 쓸 수 있게 해 준다.

decalre -p: export 확인

$ declare -p VAR


e.g.
$ AA="100"
$ declare -p LANG		# LANG 변수가 export 되어 있니?
declare -x LANG="en.UTF-8"	# 출력에 'x'가 있으면 이 변수는 export 되어 있음

$ declapre -p AA		# AA 변수가 export 되어 있니?
declare -- AA="100"	# 출력에 'x'가 없으면 이 변수는 export 된 것 아님

eval

  • 문자열명령문으로 인식하고 실행한다.

Command Substitution(명령 치환)

VAR=$( <COMMANDS> )
VAR=`<COMMANDS>`
  • 위 명령 결과로 shell에서 실행가능한 명령문이 나온다면, 그 명령은 기본적으로 실행이 가능하다.
  • 하지만 명령문이 조금 복잡해서 파이프, redirection, quotes 등이 사용된다면 그 명령문은 실행할 수 없다.
    • 명령문에서 사용되는 shell 키워드, 메타문자, quotes등은 확장과 치환 이전에 해석이 완료되기 때문이다.
    • 이러한 경우에서도 실행이 가능하게 해주는 명령이 eval이다.
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글