#!

sharp(#) + bang(!)의 합성어, shebang이라 한다.

  • 2byte의 매직 넘버(magic number)로 이 자체가 하나의 기호
  • 스크립트를 실행시킬 프로그램의 경로를 지정하는 역할
  • 이 뒤에 나오는 것은 경로명, 명령어들을 해석할 프로그램의 위치를 나타냄
  • 경로가 정확하지 않다면 bad interpreter 발생
  • 다른 인터프리터를 지정하면 문법 오류 발생

문법

#!<interpreter> [optional-arg]

#! 뒤에 공백이 하나 있어도 동작
<interpreter>에는 프로그램의 절대경로 입력

예시

#!/bin/sh
#!/bin/bash
#!/usr/bin/php
#!/usr/bin/python -O
#!/usr/bin/env bash

#!/usr/bin/env

  • interpreter에 들어갈 프로그램의 절대 경로는 시스템에 따라 달라질 수 있다.
    ex) 파이썬을 예로 들면 /bin/local/python 또는 /usr/bin/python에 위치할 수도 있고
    버전도 python2와 python3이 둘다 설치되어 있을수 있다.
  • 이럴 때 #!/usr/bin/env로 설정하면 절대경로에 상관없이 인터프리터의 위치를 찾아서 살행
    • env는 사용자의 $PATH(환경변수)에서 첫번째로 찾은 명령를 찾아서 실행됨
    • 다양한 환경에서 실행되는 스크립트라면 env 사용하기

예시

# 환경 변수 정보 출력
env

# 환경 변수 정보 변경
env -i HOSTNAME=test.com

# 환경 변수 정보 변경
env -u HOSTNAME

# env 이용한 bash 실행하기
/usr/bin/env bash --version

테스트

1. vi test 파일 작성

#!/usr/bin/env bash

echo "Hello, This is Bash"

2. 실행 권한 추가하고 실행

# 권한 추가
$ chmod +x test

# 실행
$ ./test
Hello This is Bash

3. 다시 파일을 열고 인터프리터를 파이썬으로 지정

#! /usr/bin/env python

echo "Hello This is Bash"

4. 파이썬 문법에 맞지 않아 오류 발생

$ ./test
File "./test", line 3
echo "Hello This is Bash"
^
SyntaxError: invalid syntax

5. 파일 열고 파이썬 문법으로 수정

#! /usr/bin/env python

print "Hello This is Python"

6. 파일 실행하면 정상적으로 작동함

$ ./test
Hello This is Python

 

참고

https://blog.gaerae.com/2015/10/what-is-the-preferred-bash-shebang.html

https://bcp0109.tistory.com/343

https://ingorae.tistory.com/365

구현

개요

Bash로 작성된 간단한 계산기 스크립트입니다. 사용자로부터 두 개의 숫자와 연산자를 읽고 계산을 수행한 다음 사용자가 중지를 선택할 때까지 이전 계산의 결과로 계산을 계속할 수 있습니다.

사용 언어

bash, shell script

코드 및 함수

스크립트는 나중에 사용자 입력의 유효성을 검사하는 데 사용되는 두 개의 정규식 REGEX_NUMBERREGEX_OPERATION을 정의하는 것으로 시작합니다. 그런 다음 스크립트는 여러 기능을 정의합니다.

  • #!/bin/bash : 해당 파일을 bash 쉘로 실행시킨다는 의미
  • TOTAL : 연산 결과를 저장하는 전역 변수
  • FLAG : 연산을 계속 할 지 여부를 저장하는 전역 변수
  • REGEX_NUMBER : 숫자 확인 정규표현식
  • REGEX_OPERATION : 사칙연산 확인 정규표현식

is_number

사용자에게 숫자를 입력하라는 메시지를 표시한 다음 REGEX_NUMBER 정규식을 사용하여 입력이 유효한 숫자인지 확인합니다. 입력이 유효한 숫자이면 함수는 숫자를 반환합니다. 입력이 유효한 숫자가 아닌 경우 함수는 사용자에게 다시 시도하라는 메시지를 표시합니다.

 

문자 설명
" " " " 사이에 들어있는 모든 특수 문자를 일반 문자로 인식하지만 단, $()와 ` `(명령어 대체 특수문자), $ (변수 값 대체 특수문자), \ (quotation 특수문자) 등은 예외

즉, echo "$op" 으로 하면 * 로 입력받은 인자값을 asterisk이 아닌 문자 그대로 * 로 출력할 수 있습니다.

is_operation

is_number와 같은 방식으로 작동하지만 사용자에게 연산(+, -, *, /, %)을 입력하라는 메시지를 표시하고 REGEX_OPERATION 정규식을 사용하여 입력을 확인합니다.

is_divided_by_zero

연산이 나누기(/)이고 두 번째 피연산자가 0인지 확인하는 함수입니다. 두 조건이 모두 참이면 사용자에게 새 연산기호와 두 번째 피연산자를 입력하라는 메시지가 표시됩니다.

calculate

세 개의 인수(연산자와 두 개의 피연산자)를 사용합니다. case 문을 사용하여 연산자를 기반으로 수행할 작업을 결정한 다음 피연산자를 사용하여 계산을 수행합니다. 계산 결과는 TOTAL 변수에 저장됩니다.

is_answer

사용자에게 "YES" 또는 "NO"를 입력하라는 메시지를 표시하고 그에 따라 FLAG 변수를 1 또는 0으로 설정합니다. 이 기능은 유연하며 사용자가 대문자 또는 소문자 또는 축약형 "y" 또는 "n"으로 "YES" 또는 "NO"를 입력할 수 있습니다.

main

사용자가 중지를 선택할 때까지 계속되는 루프에 들어갑니다. 루프 내에서 스크립트는 is_number 및 is_operation 함수를 사용하여 첫 번째 숫자, 연산자 및 두 번째 숫자를 읽은 다음 is_divided_by_zero 함수를 사용하여 연산이 0으로 나뉘는지 확인합니다. 연산이 0으로 나누지 않는 경우 스크립트는 연산을 수행하기 위해 연산 함수에 연산자와 피연산자를 전달합니다. 그런 다음 스크립트는 사용자에게 계속하거나 중지하라는 메시지를 표시하고 사용자가 중지를 선택하면 루프를 종료합니다. 루프가 끝나면 스크립트는 TOTAL 변수에 저장된 최종 결과를 인쇄합니다.

  • $op 를 "$op"로 넘겨줘야 연산기호를 문자열로 인식해서 제대로 작동

결과

실행 방법

sh cal.sh

화면

궁금한 점

  • -eq vs =
    값을 비교할 때, -eq=의 성능이나.. 차이가 있는지? 어떤걸 쓰는게 좋은지?

1. bash 커맨드

ls

현재 디렉토리 파일 목록 나열

  • ls -F : 파일과 디렉토리를 구분하여 출력
  • ls -a : 숨겨진 파일, 디렉토리도 함께 출력
  • ls -l : 자세한 내용
  • ls -al : a와 l의 기능 모두 포함
  • ls -h -al : 파일크기도 함께 출력
  • ll : 한 줄씩 파일의 상세 정보

mv

파일 또는 디렉토리의 이동 또는 이름 변경

  • mv [원본 파일명] [옮기고 싶은 디렉토리명] : 해당 디렉토리로 파일 이동
  • mv [원본 파일명] [바꾸고 싶은 파일명] : 원본 파일 이름 변경
  • mv [원본 디렉토리명] [옮기고 싶은 디렉토리명] : 해당 디렉토리로 디렉토리 이동
  • mv [원본 디렉토리명] [바꾸고 싶은 디렉토리명] : 원본 디렉토리 이름 변경

cp

파일 또는 디렉토리의 복사

  • cp [원본 파일명] [옮기고 싶은 디렉토리명] : 해당 디렉토리로 원본 파일 복사
  • cp [원본 파일명] [복사해서 만들고 싶은 디렉토리명] : 해당 디렉토리로 사본 파일 복사
  • cp [원본 파일명1] [원본 파일명2] [옮기고 싶은 디렉토리명] : 해당 디렉토리로 여러 파일 한번에 복사
  • cp [원본 디렉토리] -r [옮기고 싶은 디렉토리명] : 원본 디렉토리의 하위 파일까지 모두 해당 디렉토리로 복사
  • cp [원본 디렉토리] -r [복사해서 만들고 싶은 디렉토리명] : 복사해서 만들고 싶은 디렉토리 생성

cat

두개 이상의 파일 전체 내용 출력

  • cat [파일명1] [파일명2] : 두개 이상의 파일을 연속으로 출력
  • cat -n [파일명1] [파일명2] : 두개 이상의 파일을 연속으로 출력

tail

파일을 지정한 행까지 출력 (디폴트 : 10개 행)

  • tail [파일명]
  • tail -n 숫자 [파일명] : 마지막 행부터 해당번째 행 출력
  • tail +숫자 [파일명] : 해당번째 행부터 마지막 행까지 출력

rm

파일 또는 디렉토리 삭제

  • rm [파일명] : 해당 파일 삭제
  • rm *.[확장자] : 해당 확장자로 끝나는 모든 파일 삭제
  • rm * : 전체 파일 삭제
  • rm -r [파일명/디렉토리명] : 해당 파일/디렉토리 삭제
  • rm -rf [파일명/디렉토리명] : 해당 파일/디렉토리 강제 삭제 (경고문구 없음)


아래 내용들은 추가 공부 필요


nohup

터미널을 종료해도 프로그램이 백그라운드에서 계속 실행되도록 함


chown

파일이나 디렉토리의 소유권자 및 그룹식별자 변경


chmod

해당 파일이나 디렉토리의 퍼미션 수정


grep

정규표현식의 패턴을 사용해서 특정 파일 내에 해당 패턴의 문자열 출력


ps

현재 작동하는 프로세스 목록 출력


기타

알고 있거나 참고할 만한 것들


  • cd
  • pwd
  • clear
  • mkdir
  • touch
  • history history -c
  • bash -x ./[파일명] : 디버그

2. vi 편집기 모드

  • 기본 모드
    • vi 편집기 처음 열었을 때 화면
  • 입력 모드
    • i, a를 통해 기본에서 입력 모드로 전환
    • esc를 통해 입력에서 명령 모드로 전환
  • 명령 모드
    • : (콜론)을 통해 명령
    • 파일 저장, 종료 또는 검색 등을 함

3. vi 커맨드

  • esc + 명령어 입력

명령 모드에서 입력 모드로 전환

  • i : 현재 커서 앞(왼쪽)에 입력
  • a : 현재 커서 다음(오른쪽)에 입력

저장, 종료

  • :q : 종료
  • :q! 강제 종료 (저장 X)
  • :w : 저장 (종료 X)
  • :wq : 저장 및 종료
  • ** 비정상 종료 시 .swp 파일이 생성된다. 필요하지 않은 경우 삭제한다.

커서 이동

  • h, j, k, l : 좌, 하, 상, 우 이동
  • w : 다음 단어의 첫 글자로 이동
  • b : 이전 단어의 첫 글자로 이동

줄 이동

  • gg : 첫번째 행으로
  • G : 마지막 행으로
  • :숫자 : 지정한 숫자 행으로 이동

삭제

  • x : 현재 커서 위치에 있는 한 글자 삭제
  • dd : 현재 커서 위치에 있는 한 행 삭제
  • dw : 현재 커서 위치에 뒤에 있는 단어 삭제 (커서 포함)
  • db : 현재 커서 위치에 앞에 있는 단어 복사
  • ** 삭제된 내용은 붙여넣기 가능 (버퍼에 저장됨)

복사

  • yy : 현재 커서 위치에 있는 한 행 복사
  • yw : 현재 커서 위치에 뒤에 있는 단어 복사
  • yb : 현재 커서 위치에 앞에 있는 단어 복사

붙여넣기

  • p : 커서 다음에 붙여넣기
  • P : 커서 이전에 붙여넣기

찾기

  • /[검색어] : 앞에서부터 검색어를 찾음
  • /[검색어] : 뒤에서부터 검색어를 찾음
  • n : 뒤로 검색
  • N : 앞으로 검색

바꾸기

  • :%s/old/new : 각 행에 처음 나오는 old를 new로 변경
  • :%s/old/new/g : 모든 old를 new로 변경
  • :%s/old/new/gc : 모든 old를 new로 변경하기 전에 물어봄

기타

  • u : undo
  • ctrl+r : redo
  • :set nu : 행번호 출력
  • :set nonu : 행번호 숨기기
  • :set ts=4 : tap size를 4로 설정
  • :set title : 타이틀 바에 현재 편집 중인 파일을 표시



참고

https://velog.io/@zeesoo/Linux-vi-편집기-사용법-및-명령어

https://velog.io/@devmin/리눅스-쉘-기본-명령어Basic-Shell-Commands

+ Recent posts