posted by 귀염둥이채원 2021. 4. 15. 02:44

---------------------------------------------------------

# echo 옵션

---------------------------------------------------------

-n: 마지막에 따라오는 개행 문자(newline) 문자를 출력하지 않음

-e: 문자열에서 역슬래시(\)와 조합되는 이스케이프 문자(escape sequence)를 문자로 인식

 

---------------------------------------------------------

# echo와 printf를 이용한 출력

---------------------------------------------------------

#!/bin/bash

 

echo ""

echo "echo-----------"

# 줄바꿈한다.

echo "hello world"

# -n옵션 사용시 개행 문자(newline) 문자를 출력하지 않음

echo -n "hello world"

 

echo ""

echo "print-----------"

# 개행 문자(newline) 문자를 출력하지 않음

printf "hello world"

printf "%s %s" hello world

 

# "\n"을 사용하여 줄바꿈한다.

printf "%s %s\n" hello world

 

# output

$ bash test.sh

 

echo-----------

hello world

hello world

print-----------

hello worldhello worldhello world

 

---------------------------------------------------------

# echo에서 -e 옵션 사용 예시

---------------------------------------------------------

#!/bin/bash

# -e 옵션 없음

echo "1\n2\n3\n"

 

# -e 옵션 있음

echo -e "1\n2\n3\n"

 

# -e 옵션 있음

echo -e "1\t2\t3\t"

 

# output

$ bash test.sh

1\n2\n3\n

1

2

3

 

1 2 3

 

---------------------------------------------------------

# echo에서 -e 옵션 사용 예시

---------------------------------------------------------

#!/bin/bash

 

# -e 옵션은 escape 문자를 사용가능하게 합니다.

echo -e "1234567890"

 

# new line

echo -e "123

456

789

0"

 

# tab

echo -e "123 456 789 0"

 

# \v vertical tab

echo -e "123\v456\v789\v0"

 

# \c 이후 내용 생략, new line 포함

echo -e "123456\c7890"

 

# output

$ bash test.sh

123457890

123

456

789

0

123 456 789 0

123

456

789

0

123456

 

posted by 귀염둥이채원 2021. 4. 15. 02:41

---------------------------------------------------------

# 스크립트 실행 방법

---------------------------------------------------------

echo "hello world"

printf "hello world"

printf "%s %s" hello world

 

가지 방법으로 bash 파일을 실행 가능

# 첫번째 방법

$ bash test.sh

 

# 두번째 방법

$ chmod a+x test.sh

$ ./ test.sh

 

---------------------------------------------------------

# 주석처리

---------------------------------------------------------

#!/bin/bash

val=25

 

# Comment - print value

echo $val

 

# Multiline comment

: '

multiline comment

multiline comment

multiline comment

multiline comment

multiline comment

'

echo $val

 

# output

$ bash test.sh

25

25

 

---------------------------------------------------------

# 스크립트 auto indent (줄맞춤)

---------------------------------------------------------

# vim에서 gg=G를 입력한다.

gg - go to beginning of the file

G - go to end of the file

= - indent

 

# vimrc 설정

set sw=4

filetype indent on

 

# Reference

https://unix.stackexchange.com/questions/19945/auto-indent-format-code-for-vim

https://www.unix.com/unix-for-dummies-questions-and-answers/87221-vi-auto-indent-whole-file-once.html

 

# vscode에서 plugin을 설치

Shift + Option + F

 

# Reference

https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format

https://marketplace.visualstudio.com/items?itemName=shakram02.bash-beautify

 

---------------------------------------------------------

# 쉘스크립트 문법 체크

---------------------------------------------------------

아래 사이트에서 문법이 잘못된 부분을 체크해준다.

https://www.shellcheck.net/

 

---------------------------------------------------------

# 디버깅 - set 옵션들 (-e, -u, -x)

---------------------------------------------------------

set은 쉘의 옵션을 설정하는 명령어이다.

-e, -u 옵션을 설정하면 스크립트에서 문제가 발생한것을 찾을수 있다.

* -e: 쉘 스크립트 실행 중에 0이 아닌 값으로 exit을 한 명령이 있으면 나머지 스크립트를 실행하지 않은 채 exit한다.

* -u: 정의되지 않은 변수(undefined)를 참조하면 에러를 출력하며 바로 exit한다.

* -x: 쉘 스크립트가 실행하는 모든 명령을 화면에 출력한다. 디버깅에 유용하다.

 

# 쉘스크립트의 도입부에 다음과 같이 적으면 된다.

set -e -u -x

 

# bash xxx.sh 실행시 옵션 적용

bash -x xxx.sh

bash -eux xxx.sh

 

---------------------------------------------------------

# shell command 실행

---------------------------------------------------------

#!/bin/bash

# use backticks " ` ` " to execute shell command

echo `date`

 

# executing bash command without backticks

echo date

 

# use #(command)

echo $(date)

 

# shell execution

echo "I'm in $(pwd)"

echo "I'm in `pwd`"

 

# output

$ bash test.sh

2021410일 토요일 041028초 KST

date

2021410일 토요일 041028초 KST

I'm in /src/shell

I'm in /src/shell

 

---------------------------------------------------------

# 스크립트 디렉토리와 이름 출력

---------------------------------------------------------

#!/bin/bash

# Get the location where this script is located since it may have been run from any folder

scriptFolder=$(cd $(dirname "$0") && pwd)

# Also determine the script name, for example for usage and version.

# - this is useful to prevent issues if the script name has been changed by renaming the file

scriptName=$(basename $scriptFolder)

 

echo "scriptFolder: $scriptFolder"

echo "scriptName: $scriptName"

 

# output

$ bash test.sh

scriptFolder: /Users/src/shell

scriptName: test.sh

 

---------------------------------------------------------

# 마지막 작업의 종료 상태 확인

---------------------------------------------------------

#!/bin/bash

# The following will always fail because the file does not exist.

fileToRemove="/tmp/some-file-that-does-not-exist"

 

# Redirect error to /dev/null so script message is used instead.

rm "$fileToRemove" 2> /dev/null

if [ $? -eq 0 ]; then

echo "Success removing file: $fileToRemove"

else

echo "File does not exist: $fileToRemove"

fi

 

# output

$ bash test.sh

File does not exist: /tmp/some-file-that-does-not-exist

 

---------------------------------------------------------

# 학습자료들

---------------------------------------------------------

# 핵심 요약 자료

https://blog.gaerae.com/2015/01/bash-hello-world.html

http://programmingexamples.wikidot.com/bash-scripting

https://linuxconfig.org/bash-scripting-tutorial

 

# cheetsheet

https://devhints.io/bash

 

# tutorial

https://linuxhint.com/30_bash_script_examples/

https://linuxconfig.org/bash-scripting-tutorial

http://learn.openwaterfoundation.org/owf-learn-linux-shell/useful-scripts/useful-scripts/

 

# template

https://betterdev.blog/minimal-safe-bash-script-template/

https://github.com/ralish/bash-script-template/blob/main/template.sh

https://natelandau.com/boilerplate-shell-script-template/

https://jonlabelle.com/snippets/view/shell/another-bash-script-template

http://mars.tekkom.dk/w/index.php/Bash_script_template

https://dev.to/thiht/shell-scripts-matter

 

# example

https://www.tecmint.com/linux-server-health-monitoring-script/

 

# youtube

https://www.youtube.com/watch?v=RIKJVIcYNqE&list=PLYRfEO8DA8gikpkXw8wF8kJZDod2lFrML&index=1

https://www.youtube.com/watch?v=08XnZ8YA8MU&list=PLTJfebMjBKSLv0yQrgCOBLZtvBBD5lWqu&index=1

https://www.youtube.com/watch?v=035pZp2R50M

https://www.youtube.com/watch?v=RdY7wiCPN-Q

https://www.youtube.com/watch?v=GtovwKDemnI

https://www.youtube.com/watch?v=e7BufAVwDiM

https://www.youtube.com/watch?v=cQepf9fY6cE&list=PLS1QulWo1RIYmaxcEqw5JhK3b-6rgdWO_

 

# 참고 자료

http://mug896.github.io/bash-shell/

https://linuxhint.com/category/bash-programming/

https://github.com/awesome-lists/awesome-bash

https://github.com/alebcay/awesome-shell

https://awesomerank.github.io/lists/alebcay/awesome-shell.html

posted by 귀염둥이채원 2021. 4. 8. 21:55

; - 앞의 명령어가 실패해도 다음 명령어가 실행
&& - 앞의 명령어가 성공했을 때 다음 명령어가 실행
& - 앞의 명령어를 백그라운드로 돌리고 동시에 뒤의 명령어를 실행

# ; - 성공여부와 상관없이 다음 명령어 실행
$ mkdir test; cd test; touch abc

test 디렉토리가 이미 상황이라면 아래와 같은 결과가 된다.
mkdir test(실패); cd test; touch abc
이 경우 cd test가 실행되고, touch abc도 실행된다.

# && - 성공한 경우에 다음 명령어 실행
반면에 아래의 경우는 cd test와 touch abc가 실행되지 않습니다.
$ mkdir test(실패) && cd test && touch abc

# 명령의 그룹핑 {}
$ mkdir test && { cd test3; touch abc; echo 'success!!' } || echo 'There is no dir';
mkdir test가
성공했을 때 cd test2; touch abc를 실행하고 success!!를 출력합니다.
실패했을 때 echo 'There is no dir'를 실행합니다.
이때 실행되는 명령들은 현재 쉘의 컨텍스트에서 실행됩니다. 만약 서브 컨텍스트에서 실행하고 싶다면 '('와 ')'를 사용하시면 됩니다. (참고)

# 명령어의 반환값
리눅스(유닉스)의 모든 명령어는 종료할 때 성공 여부를 알려줍니다.
test 디렉토리가 없는 곳에서 아래 명령을 실행해보세요.
$ mkdir test

그리고 아래 명령을 실행해보세요.
echo $?
이 명령어는 이전 명령어가 반환한 값을 알아내는 것입니다. 결과는 아래와 같습니다.
0

반대로 test 디렉토리가 이미 있는데 mkdir test를 실행한 후에 echo $?를 실행하면 아래 값이 출력됩니다.
1
또는 존재하지 않는 명령어를 실행하면 127이 출력될꺼예요. 즉 리눅스에서는 0이 아닌 값은 실패(false)를 의미합니다.

즉, 리눅스에서는 0이 아닌 값은 실패(false)를 의미


# 참고사이트
https://opentutorials.org/course/2598/15818
http://www.gnu.org/software/bash/manual/html_node/Command-Grouping.html