셸 스크립트
: 여러가지 명령어들을 연속적으로 실행시키기 위한 스크립트
컴파일 과정이 없고, 인터프리터가 소스 파일에서 명령문을 판독
cat > hello.sh
01 : #!/bin/bash
02 : echo Hello Linux
01) "#!/bin/bash"는 해당 스크립트를 실행시키는 셸 경로
02) 실제적인 명령을 내리는 부분
./hello.sh
Hello Linux
예를 들어 해당 스크립트를 실행 시키면 위와 같은 화면이 뜬다
변수의 종류
- 환경 변수 : 초기 설정에 대한 정보를 저장
- 프로그램 변수 : 셸 스크립트 내에서 지정하고 사용
- 특수 파라미터 변수 : 셸 스크립트에 인수로 전달될 때 사용
현재 셸의 프로세스 번호 등..- $0 : 셸 스크립트 이름
- $1 ~ $9 : N번째 파라미터
- $* : 전체 파라미터들
- $# : 파라미터 개수
- $$ : 현재 셸의 PID
- $@ : 모든 파라미터
- $? : 이전 명령어의 종료 상태
$ cat params.sh
#!/bin/bash
echo "Script name: $0"
echo "First argument: $1"
echo "All arguments: $*"
echo "Number of arguments: $#"
echo "Current shell PID: $$"
echo "Last command exit status: $?"
echo "All arguments: $@"
params.sh 스크립트를 실행시키면 다음과 같은 결과가 출력되는 것을 볼 수 있다
$ ./params.sh 1 2 3 4 5
Script name: ./params.sh
First argument: 1
All arguments: 1 2 3 4 5
Number of arguments: 5
Current shell PID: 1545
Last command exit status: 0
All arguments: 1 2 3 4 5
리스트 변수도 사용할 수 있는데, 사용법은 아래와 같다
# 배열 변수 정의
fruits=("apple" "banana" "cherry")
# 배열의 특정 요소 접근
echo "First fruit: ${fruits[0]}"
echo "Second fruit: ${fruits[1]}"
echo "Third fruit: ${fruits[2]}"
# 배열의 모든 요소 접근
echo "All fruits: ${fruits[@]}"
조건문
if문
if [ 조건 ]; then
문장 1
else
문장 2
fi
비교 연산자 | 설명 |
A -eq B | A와 B의 값이 같음 |
A -ne B | A와 B의 값이 같지 않음 |
A -gt B | A가 B보다 큼 |
A -lt B | A가 B보다 작음 |
A -ge B | A가 B보다 크거나 같음 |
A -le B | A가 B보다 작거나 같음 |
case문
case $[변수명] in
val1)
echo val1;;
val2)
echo val2;;
val3)
echo val3;;
*)
echo Unknown;;
esac
반복문
for문
# 리스트 요소 순회
for i in a b c; do
echo $i
done
# 배열 변수 순회
str=("a" "b" "c")
for i in "${str[@]}"; do
echo $i
done
while문
# 조건이 참인 동안 명령어 반복
flag = 5
while [ $flag -le 5 ]; do
echo "attemp: $flag"
flag=$((flag + 1))
done
until문
# 조건이 거짓인 동안 명령어 반복
flag = 0
until [ $flag -eq 1 ]; do
echo "Non stop"
done
함수의 사용과 디버깅
#!/bin/bash -x
function A {
echo "this is function A"
}
function B {
echo "this is function B"
}
B
A
echo "Finish!"
#!/bin/bash 뒤에 -x 옵션을 붙여주면 디버깅이 가능하다
과제
💡 다음 중 명령어에 대한 출력이나 입력을 원하는 위치로 바꿀 때 사용되는 리다이렉션 명령어가 아닌 것은?
- >> : 기존 파일의 내용 뒤에 결과를 추가(출력 리다이렉션)
- > : 기존 파일의 내용을 삭제하고 새로 결과를 저장(출력 리다이렉션)
- < : 표준 입력을 바꿈(입력 리다이렉션)
- ~
정답) 4번
💡 오류 메시지를 파일로 저장하기 위한 방향 재지정 명령으로 옳은 것은?
- cat nofile 0> error_log_file
- cat nofile 1> error_log_file
- cat nofile 2> error_log_file
- cat nofile > error_log_file
정답) 2번
💡 환경 변수를 영구적으로 설정하려면 어떤 파일에 추가해야 하는가?
정답) .bashrc 파일에 추가해야 한다
💡 새로운 환경 변수를 현재 셸 세션에 적용하기 위해 어떤 명령어를 사용해야 하는가?
정답) source ~/.bashrc 를 입력하면 사용자 환경 설정을 즉시할 수 있다
💡 리눅스에서 셸이 명령어를 찾을 수 있도록 지정하는 검색경로(PATH)를 설정하는 파일로 가장 알맞은 것은?
- /etc/profile
- /etc/passwd - 시스템에 로그인할 수 있는 사용자의 목록을 저장하고 있는 파일
- /etc/shadow - passwd 파일에서 패스워드를 암호화한 파일
- /etc/environment - 시스템 시작시 자동 실행되는 파일
정답) 1번
💡 bash 환경에서 아래 명령의 실행 결과에 대한 설명으로 가장 적절한 것은?
# export PATH=$PATH:/etc
- 기존의 경로(PATH)를 제거하고 새로운 경로를 추가했다.
- 기존의 경로(PATH)에 /etc 라는 새로운 경로를 추가했다.
- 잘못된 명령으로, export $PATH-PATH:/etc로 실행하는 것이 옳다.
- 잘못된 명령으로, export $PATH=PATH:/etc로 실행하는 것이 옳다.
정답) 2번
💡 셸 스크립트 프로그래밍을 할 때에, 스크립트의 첫 번째 줄에 위치하며, 스크립트의 해석기를 지정하는 것은 무엇인가? (bash 를 사용한다고 가정할 때)
정답) #!/bin/bash
💡 사용자에게 이름을 입력받아 변수 ‘USER_NAME’에 저장하고, “Hello, [USER_NAME]”을 출력하는 스크립트를 작성하시오. 작성한 후 cat 명령어로 스크립트를 확인하고, 실행하여 결과를 캡쳐하시오.