728x90
반응형
728x90
반응형
반응형

return은 셸 스크립트에서 주로 함수 내에서 사용되며, 함수의 종료 상태(exit status)를 반환한다. 스크립트 자체의 종료 상태를 설정하거나 반환할 때는 exit를 사용한다. 

1. return의 기본 개념

  • return은 셸 스크립트 함수 내에서 함수의 종료 상태를 반환하는 데 사용
  • return은 함수 외부에서 사용할 수 없습니다. 함수 외부에서 return을 호출하면 구문 오류가 발생
  • return은 정수 값을 반환하며, 보통 0은 성공을, 0이 아닌 값은 오류 상태
#!/bin/bash

check_file() {
    if [[ -f "$1" ]]; then
        return 0  # 파일이 존재하면 0 반환 (성공)
    else
        return 1  # 파일이 존재하지 않으면 1 반환 (오류)
    fi
}

check_file "/etc/passwd"
if [[ $? -eq 0 ]]; then
    echo "File exists."
else
    echo "File does not exist."
fi

함수 외부에서는 exit 사용

#!/bin/bash

echo "Exiting with status 2."
exit 2  # 스크립트를 종료하고 종료 상태로 2를 반환

함수에서 반환된 값 사용

return은 숫자 값만 반환할 수 있기 때문에 문자열과 같은 데이터를 반환하려면 echo나 printf 명령을 사용해야 함.

#!/bin/bash

get_username() {
    local user_id=$1
    if [[ "$user_id" -eq 0 ]]; then
        echo "root"
        return 0
    else
        echo "non-root"
        return 0
    fi
}

username=$(get_username 0)
echo "Username: $username"  # 출력: "Username: root"

종료 상태와 관례

  • 0: 성공 (정상 종료)
  • 1-255: 오류 또는 특정 상태 코드 (예: 1은 일반적인 오류, 2는 사용법 오류 등)
  • 127: 명령어가 없을 때
  • 130: Ctrl + C에 의해 종료된 경우 (SIGINT)

return과 exit의 차이점

  • return:
    • 함수 내에서만 사용 가능.
    • 함수의 종료 상태를 반환.
    • 함수 외부에서 사용 시 오류 발생.
  • exit:
    • 스크립트 전체를 종료.
    • 스크립트의 종료 상태를 반환.
    • 함수 내에서도 사용할 수 있지만, 호출 시점에서 스크립트 전체가 종료됨.

Shell script의 return 문은 다른 프로그래밍 언어의 return 문과 다음과 같은 차이점이 있습니다:

1. 사용 대상

  • 프로그래밍 언어: 함수나 메서드에서 값을 반환하기 위해 return을 사용합니다. 예를 들어, Java, Python, JavaScript 등에서는 return을 통해 함수의 실행을 종료하고 값을 호출자에게 반환합니다.
  • Shell 스크립트: return은 주로 함수 내에서 사용되며, 반환 값은 함수의 종료 상태(exit status)를 나타내는 정수 값입니다. 이는 보통 0(성공) 또는 0이 아닌 값(실패 또는 오류)으로 표현됩니다.

2. 값의 의미

  • 프로그래밍 언어: return 뒤에 오는 값이 함수의 반환 값으로, 호출한 곳에서 이 값을 사용할 수 있습니다.
  • Shell 스크립트: return 뒤에 오는 값은 함수의 종료 상태(exit status)로 사용되며, 이 값은 보통 조건문(if, &&, || 등)에서 함수 호출의 성공 여부를 판단하는 데 사용됩니다.
 
728x90
반응형

'개발 > shell' 카테고리의 다른 글

[bash] 기초  (0) 2023.04.25
[shell] > 와 & 에 대한 고찰  (0) 2022.01.11
반응형

gshell은 bash의 상위호환 bash와 충돌나는 문법 없음

cshell은 구버전

 

Unix Shell
• Kernel을 둘러싸고 있는 껍데기
• 사용자가 제어할 수 있는 명령행 해석기

Bourne Shell
• 1977, Stephen Bourne
• /bin/sh

BASH (Bourne Again Shell)
• 1989, Brian Fox
• /bin/bash

 

ssh -> secure shell

-> 이걸로 게이트웨이까지 가고 그 이후론

rlogin -l 아이디 호스트명

이걸로 로그인

 

pwd: present working directory

id

uname: unix system  name -> os 정보 아키텍쳐 등

hostname

 

배쉬 내부 명령

command line argument(parameter)

echo는 기본적으로 new line이 나가기 때문에 그걸 무시하려면 -n옵션

 

ls

ls -1 파일 이름만 한줄에 하나씩

-a 숨겨진 것도

-F 파일

-l 롱포맷

 

ls 중 어떤 규칙만 필터 치고 싶다면..(패턴)

glob pattern

  • 임의의 길이(wildcard) *
  • 임의의 한 글자 ?

ls * -> 전체

ls .* -> 히든 전체

ls [a-f]*.txt -> a~f로 시작하는 텍스트 파일

ls *.tx? -> .txa 등의 확장자를 가진 파일

 

파일 시스템

  • File
    • OS에서 데이터를 디스크와 같은 저장소에 저장해 둘 때의 단위 형태
    • 넓은 의미에서는 일반 파일, 디렉토리와 각종 입출력 장치를 모두 파일로 간주
  • Directory
    • 파일을 담아두는 공간 (폴더)
    • 디렉토리 안에 디렉토리를 담을 수 있기 때문에 트리 구조로 형상화

 

cd : change directory

pwd

~ : 홈디렉토리

ls ~ 아이디 : 다른사람의 홈디렉토리

 

history

히스토리 중 다시 실행하고 싶다면

!12 : 히스토리 중 12번 재실행

!find : 히스토리 중 마지막 find로 실행했던 구문 재실행

!! : 바로 직전 명령 재실행

!$ : 바로 직전 명령의 마지막 argument

 

직전 명령 편집

echo "hello world"

^hello^java :hello -> java 변환(^ 캐럿이라고 부름)

 

touch

빈 파일 만들기, last modify date 바꿀 때

 

mkdir : make directory

rmdir : remove directory 빈 디렉토리만 삭제

 

cp 복사

mv 장소 이동, 이름 변경

rm 파일 삭제

rm -r : recursive하게 안에서부터 쫙 지우고 마지막으로 폴더 삭제

file /bin/gzip(파일) : 어떤 파일인데? 확인하는 용도

 

변수

사용자 변수
• 보통 소문자로 명명
• x=1
• x="hello world"
• x=hello world   (x)

주의사항

  • = 주위에 공백 없음

 

값을 꺼내쓰기(de-reference)

echo $x / ${x} / "$x"

 

single quote

  • literal, 문자열
  • 치환이 안됨

double quote(기본적으로 이거 사용)

  • 변수임

 

실행 결과를 변수로 저장

: backquote(`) 또는 $( )로 둘러싸기

date_str=`date +"%Y%m%d"`     
//            -> 날짜를 오른쪽 형식으로
date_str=$(date +"%Y%m%d")

 

명령 문자열을 실행하기

eval 명령문자열

  • cmd="ls –alF"
  • eval "$cmd

 

환경 변수

  • 환경(environment)
  • 프로세스를 둘러싼 주변 정보
  • env
  • 상속가능
  • export var1 = 2


exporting

  • sub-shell (쉘 안의 쉘)에서 상속받아 사용할 수 있도록 변수를 공개
  • 사용자 변수를 환경 변수로 전환
  • export나 declare –x로 지정

 

권한

u/g/o

chmod u+x test1.sh    
// -> owner에게 실행권한을 주기

실행 시 경로를 주거나 어떤걸로 실행할지 알려주면 됨

./test.sh
bash test.sh

 

소유자 변경

chown 아이디 파일

 

Boolean expression


&&, ||, !, –a, –o 

  • -a = &&이고 -o = ||

(( 0 && 1 )) && echo true || echo false   

  • -> then else
  • ((식)) && 참이면 실행 || 거짓이면 실행

(( 0 || 1)) && echo true || echo false

  • integer
    -eq -ne -gt -ge -lt –le

  • string
    < <= > >= = != -z –n
  • -z : zero length?
  • -n : null?

 

if

세미콜론, 공백과의 싸움

if [ 조건 ]; then
	실행문
fi

한 줄 쓰기

x=3; if [ $x –eq 3 ]; then echo "x is 3"; fi

 

주의사항

  • -eq 연산자는 정수 연산자
  • = 연산자는 문자열 연산자
  • 변수가 정의되지 않았거나 공백을 포함할 수 있으므로 quotation 필요
x="he llo"
if [ "$x" = "he llo" ]; then echo "$x"; fi

 

  • ==는 shell마다 약간 호환성 차이가 있음, 하나(=)를 써라

 

for/while

for loop은 foreach 형식만 지원

for(int i = 0; i <10; i++)의 형식은 while문으로 작성해야 함

while [ 조건 ]; do
	실행문
done
i=3; while [ "$i" -lt 10 ]; do echo "$i"; i=$((i+1)); done
3
4
5
6
7
8
9

무한루프 :

while :; do
	date
	sleep 5
done

or watch 명령어로 주기적으로 감시 가능

watch -n 5 "date"

for

for 변수명 in 리스트; do
	실행문
done

 

for dir in *; do
//* : 현재 경로의 파일/디렉토리를 dir에 바인딩
	[ -d "$dir" ] && (echo -n "$dir   "; cd "$dir"; ls | wc –l)
    //[ ] 가 참이면 ()를 실행
    // -d dir이 디렉토리냐?
    //에코쓰고 이동하고 안에 있는 파일의 갯수를 찍어(현재 디렉토리 하위 디렉토리 안의 파일 갯수 확인)
    //서브쉘이 끝나면 원래 디렉토리로 돌아옴; 돌아오는 코드 귀찮아서 서브쉘 
    //서브쉘 중간에 실패 시 자동으로 오니까..
done

swtich-case 문

case 변수 in 
케이스1)
	실행문;; 
케이스2) 
	실행문;;
*)
	실행문;;
esac

 

입출력 리다이렉트

 

1(생략) 이거 아니고 0(생략) 이거임! 0번이 표준입력

합칠 수도 있다!

 

필터

프로세서의 출력을 다른 프로세스의 입력으로 전달

  • | 파이프 기호를 이용
  • ls | head : ls의 출력을 head의 입력으로 받아

line by line으로 세서 출현 빈도 수로 정렬

cat test.txt | sort | uniq –c | sort -n
  • sort 알파벳순 정렬
  • uniq -c 중복을 없애면서 중복 갯수를 출력(카운트 옵션)
  • sort -nr  맨 앞을 숫자로 보겠다, 출현 빈도수가 높은걸 맨 앞으로 두고 나머지를 두라(r옵션이 desc)
find /etc 2>&1 | grep 허가
//찾아 여기서 에러랑 아닌거 같이 모아서 허가 찾아

 

문서 보기

cat은 페이징 없음

more/less 페이지씩 보여줌 엔터치면 더 보여줌(pager)

grep 문자열 파일

grep -r (모든 파일에 대해 recursive 하게 검색)

grep bash .bashrc | less -eMR

head 앞에 몇 줄만

tail 뒤에 몇 줄만 tail -f 최근 접속 실시간 출력

 

잘라내서 쓰기

cut –d 구분자 –f 필드번호 파일

구분자로 split해서 시작번호는 1번부터

1,3,4,7번째를 모아서 :로 붙여서 보여줌

grep irteam /etc/passwd | cut –d: –f1,3-4,7

 

shebang(#!)쉐벵

  • 어떤 인터프리터 프로그램을 사용할 것인가를 지정
  • #!/bin/bash
  • #!/usr/bin/env python
    • 권장하는 방식
    • 지정해주면 파이선으로 실행하지 않고 배쉬로 실행해도 배쉬가 첫 줄을 보고(인터프리터) 파이선인지 파악하여 파이선으로 실행 함
    • 리눅스 포직스(?)

 

commane line arguments

$0 자기자신 쉘 이름

$# 변수 몇 개?

$? 실행 결과 0:정상; 0이 아니면 에러

 

설정

Bourne shell

  • ~/.profile

Bash

  • login shell
  • bashrc
  • non-login shell
  • bash_profile -> 이거 하나 만 만들고 그 안에서 rc를 불러오도록 하는게 좋음

바로 적용(source)

source ~/.bashrc

 

find

find 디렉토리 목록 –name 이름패턴 –type 파일유형

find /usr/lib64
find /usr/lib64 –name "lib*.a" –ls
find /usr/lib64 –type d –name "py*"
find /usr/lib64 \( –name "python*" –o –name "pgsql*" \) –ls

 


쉘 문법 체크: shellcheck

컴퓨터에 깔아서 쓸 수도 있고, 인텔리제이 플러그인으로도 있다고 함

https://www.shellcheck.net/

 

ShellCheck – shell script analysis tool

ShellCheck finds bugs in your shell scripts

www.shellcheck.net

 

728x90
반응형

'개발 > shell' 카테고리의 다른 글

[shell] return & exit  (2) 2024.09.25
[shell] > 와 & 에 대한 고찰  (0) 2022.01.11
반응형
JAVA $JAVA_OPTS -jar $HOME/was/*.jar 1> $HOME/logs/server.log 2>&1 &

위 스크립트에서 &가 없으면 실행시킨 화면에서 실행이되고, 그 곳을 빠져나가면 shutdown 된다.

배포 쉘에 항상 저렇게 쓰는데, 매번 까먹어서 정리

  • & : executes the first command in the background, The shell does not wait for the command to finish, and the return status is 0.
  • && : executes the first command and conditionally proceeds to the second if it exits with success
  • nohup : A background process(&) will not stay alive after the shell session is closed. Nohup makes running after you disconnect from the session. sh file should has 755 permission. nohup file will be created with debig info.
  • > : redirection

참고

https://joonyon.tistory.com/98

 

쉽게 설명한 nohup 과 &(백그라운드) 명령어 사용법

안녕하세요. 린아저씨 입니다. 리눅스를 사용하다 보면 프로그램을 백그라운드에서 세션과의 연결이 끊어져도 돌려야할 일이 많이 발생합니다. 그럴때 주로 사용하는 명령어가 바로 nohup 과 &

joonyon.tistory.com

 

 

 

728x90
반응형

'개발 > shell' 카테고리의 다른 글

[shell] return & exit  (2) 2024.09.25
[bash] 기초  (0) 2023.04.25

+ Recent posts