bash 쉘 특수문자: 공백,{} 하나의 명령,[], exit, return, ${} 확장, (( )) let 산술연산, $()

markyang92·2021년 6월 15일
0

shell-script

목록 보기
3/19
post-thumbnail
post-custom-banner

파일명

  • shell에서 파일명명령을 실행할 때 사용되는 이름과 같다.
  • 리눅스에서 사용하고 있는 파일 시스템에서는 파일 이름으로 NUL, / 두 문자를 제외하고 전부 허용 한다.

    [ { [10 {echo if{ {AA=10} . : 전부 명령이름이 될 수 있다.


공백

  • shell에서 공백을 매우 신경 써야한다.

  1. 위와 같이 띄어 쓰기로 인해 wkcommand가 먹히지 않는다.

  1. wk=cd만 적용된다. 뒤, $HOME/workspace는 따로 명령이 실행된다.

  1. wk=" cmd " 형식으로 quotes를 달아서 온전하게 명령이 들어간다.
    최종 wk의 내용: cd $HOME/workspace

명령 구조

  • 명령의 기본 구조는 다음과 같다.
command arg1 arg2 arg3 ...
  $0     $1   $2   $3 ...
  • 제일 앞에 명령 이름이 오고 다음 argument 들이 공백 기준으로 split되어 들어온다.

위치 Argument

ArgumentDescription
$0실행된 스크립트 이름
$1첫 번째 Argument
$1 $2 $3...$9
${10}... 10번째 부터는 { }로 감싸줄 것
$*전체 인자 값.
$@전체 인자 값. 위 $*와의 차이는 아래에서 설명
$#Argument의 총 갯수

$*, $@ 차이

  • $*"" 상관 없이 공백 기준으로 문자열을 파라미터로 인식한다.
  • 그냥 제발 for 문에는 "$@" 쓰자.

$$, $BASHPID, $PPID, $?, $!, $-, $_

Variabledescription
$$현재 실행 중인 쉘의 PID
$BASHPID현재 실행 중인 Bash의 PID
$PPID부모 PID
$?최근 실행된 명령어 종료 상태
$!최근에 실행한 백그라운드 명령의 PID
$-현재 옵션 플래그
$_이전 명령에서 사용된 마지막 인수를 값으로 가진다.
사용된 인수가 없다면, 명령 이름이 된다.
| (pipe)로 연결된 명령들은 subshell에서 실행되므로 제외된다.

$$, $BASHPID, $PPID


$_

  • |: pipe로 연결된 명령들은 subshell에서 실행되므로 제외된다.

(( )): 산술 표현식(Arithmetic Expression)

  • 산술표현식에서 +,-,*,/ 등 계산에 사용되는 수학 연산
    • 변수 할당에서 사용할 수 있음
      • (( a=1+4 ))
      • 테스트에도 사용 if (( a < b))

let

  • let은 수식 연산을 수행하며 최종 연산 결과 == 0, return 1
    • 최종 연산 결과 == 1, return 0
$ let var=10
$ let var=var+5
$ echo $var
15
$ let "var = var + 5"
$ echo $var
20
  • let == (( )) 산술연산
let var=10
(( var = var + 5 ))

가능한 연산자

++, --

-,+

! ~: 논리 반전, 비트 반전

* / %

<< >>: 왼쪽 shift, 오른쪽 shift

<= >= < > == !=

& ^ | : 비트 연산

&& ||: 논리연산

expr ? expr : expr 삼항연산

= *= /= %= += -= <<= >>= &= ^= !=


{ }: 인라인 그룹

  • { cmd1; cmd2; }마치 하나의 명령
    • 반드시 한 칸 띄우고 cmd 사용할 것!
    • Bash 구문이 하나의 명령만을 필요로하고, 함수의 사용은 피하고 싶을 때, 이것을 사용
  • ${ }매개변수 확장에 사용된다. { } 과 구분할 것
  • ( )를 사용한 서브 쉘외부에 영향 X, exit는 서브쉘만 종료
  • { }를 사용한 인라인 그룹외부에 영향 줌, exit를 쓰면 현재 쉘 종료됨
  • { } 간단 사용 예

[ ]: test

  • [ 는 테스트용
    • if [ $? -eq 0 ]
    • 빈칸매우 주의 할 것
  • (서브쉘공백 상관 X

대입

  • 대입때는 띄워쓰기 하면 XX
# 변수 AA가 명령이 되고 = 10 는 각각 인수로 인식
$ AA = 10
AA: command not found


$ AA=10
$ BB="Hello World!"
$ echo $AA
10
$ echo $BB
Hello World!

참과 거짓

  • 0정상 종료(참)

!: 부정(NEGATE), 테스트, 종료상태 무효, 되돌리기

if [ ! -f ${F_PATH} ]; then
    echo "hello world!"
fi

exit

  • shell 지정해 종료 상태 값 지정

return

  • shell function 에서 return 명령은 프로그래밍 언어와 달리 연산 결과를 반환하는데 사용되지 않는다.

  • return 명령을 사용해 함.수.에.서!!! 종료 상태값을 지정한다.(exit와 헷갈리지 말기)

func() { expr $1 + $2 ; return 5 ; }

$를 이용한 확장

${ }: parameter expansion

  • 기본적으로 "${VAR}"는 쉘 변수에서 딱 여기까지 변수임을 나타낸다.

  • $AA, ${AA}, ${AA:-5}, ${AA%.*} ...

확장Description
${변수-문자열}변수가 설정되지 않은 경우 문자열로 변수를 치환
${변수:-문자열}변수가 설정되지 않았거나 Null로 설정된 경우 문자열로 변수 치환
${변수=문자열}변수가 설정되지 않은 경우 문자열을 변수에 저장하고 변수 치환
${변수:=문자열}변수가 설정되지 않았거나 Null로 설정된 경우 문자열을 변수에 저장하고 변수 치환
${변수+문자열}변수가 설정된 경우 문자열로 변수 치환
${변수:+문자열}변수가 설정되고, Null 이외의 값으로 설정된 경우 문자열로 변수 치환
${변수?에러메세지}변수가 설정된 경우 변수의 값을 사용하며, 설정되지 않은 경우 표준 오류 출력으로 에러 메시지를 출력
${변수:?에러메세지}변수가 Null

${VAR-STR}

  • 변수가 설정되지 않은 경우 문자열로 변수를 치환
$ HI="hello"
$ echo "${HI-world}"
hello

$ unset HI
$ echo "${HI-world}"
world

$ HI=""
$ echo "${HI-world}"

$

${VAR:-STR}

  • 변수가 설정되지 않았거나 Null로 설정된 경우 문자열로 변수 치환
$ OS="fedora"
$ echo "${OS:-ubuntu}"
fedora

$ OS=""
$ echo "${OS:-ubuntu}"
ubuntu

${VAR+STR}

  • 변수가 설정된 경우 문자열로 변수 치환
$ OS="ubuntu"
$ echo "${OS+redhat}"
redhat

$ unset OS
$ OS=""
$ echo "${OS+redhat}"
redhat

${VAR:+STR}

  • 변수가 설정되고, Null 이외의 값으로 설정된 경우 문자열로 변수 치환
$ OS="ubuntu"
$ echo "${OS:+redhat}"
redhat

$ OS=""
$ echo "${OS:+redhat}"
$

$(( )): arithmetic expansion

  • $(( 1 + 2 )) ...

산술 연산


$( ): command substitution, ` ` 와 비슷

  • RESULT=$( 명령 )을 하면, 명령의 결과로 나오는 STDOUT을 담을 수 있다.
    • RESULT = `명령` 과 비슷하다.

  • 두 명령의 결과가 똑같다


RETURN=$(${SSH_CMD} "du -sh ${HOST_WORKSPACE}/*/*/sstate-cache")
RETURN="`${SSH_CMD} \"du -sh ${HOST_WORKSPACE}/*/*/sstate-cache\"`"

expr

profile
pllpokko@alumni.kaist.ac.kr
post-custom-banner

0개의 댓글