인터프리터/스크립트 언어의 한 종류입니다. 모든 스크립트언어가 그렇듯 해석기인 shell 프로그램이 설치되어있어야합니다.


<aside> 🛠

Shell script란?

Linux Window 내용
&&, -a -and 논리연산자 AND
, -o
! -not 논리연산자 NOT
+ 좌동 산술연산자 plus
- 좌동 산술연산자 minus
* 좌동 산술연산자 times
/ 좌동 산술연산자 slash
** 좌동 산술연산자 exponentiation(누승), power
% 좌동 산술연산자 modulo, mod(나머지)
+= 좌동 산술연산자 plus-equal
-= 좌동 산술연산자 minus-equal
*= 좌동 산술연산자 times-equal
/= 좌동 산술연산자 slash-equal
%= 좌동 산술연산자 mod-equal
-eq -eq 정수-비교연산자 equal
-ne -ne 정수-비교연산자 not-equal
-gt 혹은 > -gt 정수-비교연산자 greater-than
-ge 혹은 >= -ge 정수-비교연산자 greater-than-equal
-lt 혹은 < -lt 정수-비교연산자 less-than
-le 혹은 <= -le 정수-비교연산자 less-than-equal
= 혹은 == 좌동 문자열-비교연산자 equal
!= not … == 문자열-비교연산자 not-equal
< lss 문자열-비교연산자 less-than
> gtr 문자열-비교연산자 greater-than
-z ==”” 문자열-비교연산자 the-end (문자열이 NULL, 길이가 0인 경우)
-n not …==”” 문자열-비교연산자 not-null
$(변수) 구문 문자열-비교연산자 not-null
-e 구문 파일-비교옵션 : 파일 존재
-f 구문 파일-비교옵션 : 파일 존재, 일반 파일(디렉터리/장치파일 아님)
-s 구문 파일-비교옵션 : 파일 존재, 0보다 큰 경우
-d 구문 파일-비교옵션 : 파일 존재, 디렉터리인 경우
-b 구문 파일-비교옵션 : 파일 존재, 블록장치파일인 경우
-c 구문 파일-비교옵션 : 파일 존재, 캐릭터장치파일인 경우
-p 구문 파일-비교옵션 : 파일 존재, FIFO인 경우
-h 구문 파일-비교옵션 : 파일 존재, 심볼릭 링크 설정 1이상인 경우
-L 구문 파일-비교옵션 : 파일 존재, 심볼릭 링크 설정 1이상인 경우
-S 구문 파일-비교옵션 : 파일이 소켓디바이스인 경우
-t 구문 파일-비교옵션 : 파일이 디스크립터가 터미널 디바이스와 연관있음
-r 구문 파일-비교옵션 : 파일 존재, readable
-w 구문 파일-비교옵션 : 파일 존재, writable
-x 구문 파일-비교옵션 : 파일 존재, excutable
# 좌동 문법기호 : 주석
$변수사용 $변수선언도 문법기호 : 대입연산자 앞뒤에 공백이 있으면 안됨, 변수 사용시에는 변수명앞에 $붙여서 호출
function ${@} 구문 문법기호 :  함수선언, function 함수명() { 함수내용 } 으로 선언, function은 생략가능, 인자값은 함수내용부부분에 ${@}로 사용할 부분표기, 함수사용시에는 함수명으로 사용하고, 공백을 두고 @에 들어갈 인자를 입력해줌
$0 구문 위치매개변수 : 실행된 스크립트 이름
$1
$args[n] 위치매개변수 :  1~8..9...식으로 인자순서대로 번호부여됨, 10부터는 {}로 감싸줘야함
$* $args 위치매개변수 :  전체 인자 값
$@ $args 위치매개변수 :  전체 인자 값($*와 동일하지만 큰따옴표로 변수를 감싸면 다른 결과가 나옴)
$# $args.Length 위치매개변수 : 매개변수의 총 개수
$$ $PID 위치매개변수 : 현재스크립트의 PID
$? 좌동 위치매개변수 : 최근 실행된 명령어,함수스크립트 자식의 종료상태
$! 키워드X 위치매개변수 : 최근에 실행한 백그라운드 명령의 PID
$- 키워드X 위치매개변수 : 현재 옵션 플래그
$_ 키워드X 위치매개변수 : 지난 명령의 마지막 인자로 설정된 특수 변수
array={"my","test","array","world"} $array = @("my", "test", "array", "world") 배열 : 선언
array[4]="aoo" $array[4] = "aoo” 배열 : 특정요소 설정
array=(${array[@]} "mydata") $array += "mydata” 배열 : 새로운요소 추가
echo "${array[@]}" Write-Output $array 배열 : 전체출력
echo "${array[@]}" Write-Output $array.Length 배열 : 전체개수출력
unset array[4] $array.RemoveAt(4) 배열 : 특정요소제거
unset array $array = @() 배열 : 전체요소제거
declare -r var Set-Variable -Name "var" -Value 10 -Option ReadOnly 명시표현 : 읽기전용변수 (변수타입지정  미지정시 문자열취급 + 문맥따라자동변환후연산처리)
declare -i var=10 [int]$var = 10 명시표현 : 정수형변수 (변수타입지정  미지정시 문자열취급 + 문맥따라자동변환후연산처리)
declare -a array_var [array]$arrayVar = @() 명시표현 : 배열형변수 (변수타입지정  미지정시 문자열취급 + 문맥따라자동변환후연산처리)
array_var=() $arrayVar = @() 명시표현 : 배열형변수 초기화 (변수타입지정  미지정시 문자열취급 + 문맥따라자동변환후연산처리)
declare -x var="?" [Environment]::SetEnvironmentVariable("var", "value") 명시표현 : 환경변수 (변수타입지정  미지정시 문자열취급 + 문맥따라자동변환후연산처리)
export var="?" [Environment]::SetEnvironmentVariable("var", "value") 명시표현 : 환경변수 (변수타입지정  미지정시 문자열취급 + 문맥따라자동변환후연산처리)
declare -f Get-Command -CommandType Function 명시표현 : 현재스크립트의전체함수를출력 (변수타입지정  미지정시 문자열취급 + 문맥따라자동변환후연산처리)
declare -f 함수이름 Get-Command -Name 함수이름 명시표현 : 현재스크립트의지정된함수를출력 (변수타입지정  미지정시 문자열취급 + 문맥따라자동변환후연산처리)
$PATH 환경변수 : 실행파일 검색 경로
$DISPLAY 환경변수 : X윈도우라는 GUI를 사용가능한데, 거기서 디스플레이 위치/이름을 정하는 변수 (첫번째 윈도우의 초기값은 :0 )
$HOME 환경변수 : 사용자 홈 디렉토리 (폴더)
$PS1 환경변수 : 쉘(cmd호환, 커널과 사용자인터페이스, 명령어처리) 프롬프트의 설정값
$PWD 환경변수 : 현재작업 디렉토리(폴더)
$SHELL 환경변수 : 사용하는 쉘프로그램 이름
$TERM 환경변수 : 터미널 종류의 이름 (쉘은 터미널로 연결하여 수행됨)
$MAIL 환경변수 : 메일이 저장된 파일의 경로
$MAIL_CHECK 환경변수 : 메일의 도착여부를 검사하는 시간 간격 (초단위)
$LANG 환경변수 : 프로그램사용시 기본 지원되는 언어
$USER 환경변수 : 사용자이름
getenv("변수") 환경변수 : 값 확인
putenv("변수=값") 환경변수 : 추가/수정
setenv("변수","값","덮어쓰기여부") 환경변수 : 수정/취소, putenv와 비슷하나 덮어쓰기/취소하기 추가옵션
fork 프로세스 : 새로운 프로세스 생성/복제 (상위/부모 프로세스를 복제하여 자식/하위 프로세스를 생성)
exec 프로세스 : 새로운 프로세스를 수행 (excute)
wait 프로세스 : fork후 exec로 실행한 프로세스의, 부모 프로세스가 자식프로세스의 종료등 event를 기다림, 일시 중지를 의미
kill 프로세스 : 프로세스 제거
ps 프로세스 : 현재 프로세스 상태확인
getpid 프로세스 : 자신의 프로세스 아이디 가져오기
getppid 프로세스 : 부모 프로세스의 아이디 가져오기
who 현재
시스템에 접속한 사용자 정보 출력 이하 정리필요~~~~~~~~~
pipe( ) 왼쪽의 명령어 리턴을 오른쪽에 인풋으로 전달
sleep 숫자 입력받은 숫자만큼 대기
read 변수 변수에 프롬프트에서 입력한 값을 받는다
((
)) / let 이중괄호 사용시 혹은 let를 앞에 붙여줄시, 산술연산이
가능해짐 //let sum += $변수 // ((sum += $변수))
$변수 변수의 값 / 변수 / 변수의 이름 / 대입연산시 왼쪽에는
변수의 이름이 위치해야함
chmod 파일 : 권한 모드(읽기,쓰기,실행) 설정 / 파일 접근 제한 ㄴ*(UNIX) 총 열자리 명령어에서 1은 -(파일) or d(폴더), 뒤에는 3글자씩 사용자-그룹-기타에게 rwx 읽기쓰기실행 권한 or - 미부여를 입력
chown 파일 : 소유자 변경
find 파일 : 찾기
쉘스크립트 확장자 .sh

실행방법 : ./파일이름.sh 인자(파일존재확인스크립트이므로 파일명)

#!/bin/bash //사용하는 명령어해석기는 bash쉘

file_name = $1 //입력된 두번째 항을 대입, 띄어쓰기를 기준해서 첫항은 0, 둘째항은 1 이런식...

if [ -f $file_name ]; then //-f 파일명 : 존재하면 참반환

echo "file does exist" //텍스트메시지 출력

else

echo "file doesn't exist" 

fi

선택if문 : if/then / elif/then /else /fi 순서

선택switch문 : case변수 in   /   값1)   /   값2)   /   *)   /    esac

반복for문 : for 변수명 in 리스트   /   do 반복할 코드  /   done

반복while문 : while 조건식(참이면 반복)   /   do 반복할 코드  /   done

반복until문 : until 조건식(참이 될때까지 반복, ==거짓이면 반복)   /   do 반복할 코드  /   done

반복select문 : select 변수 in 선택1 선택2 ... / do / case $변수 in / 선택1) 구현부;;  / 선택2) 구현부;;  /  *) 보기없는 선택지 ...  / esac  /   done

select 어떤기능 in pwd date quit

do

case $어떤기능 in

pwd) ............;;

date) ............;;

quit) ............;;

*) echo "invalid input"

esac

done

<쉘 스크립트 기본문법>

반복문

#for, string문자열 3개 출력
for string in "this" "is" "shell"; do;
    echo ${string};
done

#while, i가 3보다 작으면 계속 실행
i=0
while [ ${i} -le 3 ]; do;
    echo ${i}
    i=$(( ${i}+1 ))
done

#until, j가 3보다 작거나 같을 때까지 계속 실행
j=10
until [ ${j} -le 3 ]; do
    echo ${j}
    j=$(( ${j}-1 ))
done

조건문

# if로 시작 fi로 맺음
# 2개 이상의 변수 조건을 비교하는 경우[[]], 1개 비교는 []
# 다중 조건문 if elif else 순서고 else전 각 단계에 ; then 추가
str1="shell"
str2="bash" ...
if [[ ${str1}==${str2} || ${str2}==${str3} ]] || [ ${str4}==${str5} ]; then

elif [ ~~~ ]; then
    echo "~~"
else
    echo "~~"
fi

선택문

# | 기호로 다중값입력
# case조건문시 조건문장끝에 반드시 ; 로 끝내야
for string in "this" "is" "shell" "script" "by" "b-" "a-" "sh"; do
    case ${} in
        this|THIS)
            echo "${string} : 해당케이스의 여러가지 오타를 | 로 잡아줌~~~"
            ;;
        is|iss)
            echo "${string} : 해당케이스의 여러가지 오타를 | 로 잡아줌~~~"
            ;;
        b-|b)
            echo "${string} : 해당케이스의 여러가지 오타를 | 로 잡아줌~~~"
            ;;
        sh|shh)
            echo "${string} : 해당케이스의 여러가지 오타를 | 로 잡아줌~~~"
            ;;
        *|)
            echo "${string} : *기타모든케이스~~~"
            ;;
    esac
done

디버깅 : echo, exit, tee 활용해서 화면출력으로 확인 + 스크립트 실행시 아래 디버깅 옵션 활용

| --- | --- | --- |