[Linux Shell] Shell Script 명령어 정리
775 words
4 minutes
Shell Script 명령어 정리
Shell?
- 사용자가 입력한 명령어를 해석해서 kernel에 전달
- 현재 쓰고 있는 쉘을 확인하려면
echo $SHELL로 확인하면 된다.
Bash Shell과 변수
Shell의 변수
Shell의 환경변수
- 환경변수: 동작되는 프로그램에 영형을 주는 변수
- 환경변수선언
export 변수이름=변수
- 환경변수는 주로 대문자를 사용한다.
- 시스템의 환경변수는
env 명령어로 확인이 가능하다.
Bash Shell의 기능들
Quoting Rule
- Shell에서 특별한 의미가 있는 문자들이 있다. (
*, [] 등등)
*: means “match zero or more characters”
?: matches a single character
201?.txt will match 2017.txt or 2018.txt, but not 2017-01.txt
[...]: matches any one of the characters inside the square brackets
201[78].txt matches 2017.txt or 2018.txt, but not 2016.txt
{...}: matches any of the comma-separated patterns inside the curly brackets
{_.txt, _.csv} matches any file whose name ends with .txt or .csv
\를 통해서 위의 메타문자들이 바로 뒤에서 문자 그대로 사용되도록 만들 수 있다.
"" 내의 메타문자들의 의미를 제거한다. 단, $, ``은 제외
'' 내의 메타문자들의 의미를 제거한다.
Nesting commands
- 명령어의 실행 결과를 치환하여 명령을 실행
- 두가지의 방법이 있는데
$(명령어), `명령어` 를 이용한다.
- 예를 들어
echo "Today is $(date)"
echo "Today is `date`"
Alias
- 명령어를 다른 이름으로 사용, 복잡한지만 자주 쓰는 명령어는 편하게 만들어 놓을 수 있을 것이다.
alias 명령어를 실행하면 지금 저장된 alias들을 볼 수 있다.
- alias 등록
alias 원하는줄임말=명령어
- 근데 명령어에 띄어쓰기가 있으면 당연히 따옴표들로 감싸줘야한다.
- alias 해제
- 근데 shell 끄면 alias는 날라간다. 계속 사용하고 싶으면
.bashrc 같은 파일에 저장해야 한다.
Redirection
- 일반적으로 키보드를 통해서 내용을 입력하면 프로그램이 이를 받고 결과를 터미널을 통해 보여준다.
- 하지만 때로는 이를 redirect하고 싶을 경우가 존재한다.
| communication channels |
redirection character |
의미 |
| STDIN |
0<, 0<< |
입력을 키보드가 아닌 파일을 통해 받음 |
| STDOUT |
1> (덮어쓰기), 1>> (추가) |
표준 출력을 터미널이 아닌 파일로 출력 |
| STDERR |
2>, 2>> |
표준 에러 출력을 터미널이 아닌 파일로 출력 |
- 위에서 숫자 0,1 은 생략이 가능하고 주로 생략해서 사용한다.
Pipeline
- 명령의 실행결과를 다음 명영의 입력으로 전달
명령어1 | 명령어2 | 명령어3
Bash Shell Script
- 리눅스 명령어를 모아놓은 ASCII Text 파일
#으로 시작하는 것은 comment, #!/bin/bash을 통해서 스크립트를 실행할 sub shell를 지정하여 /bin/bash bash shell script를 실행하는 것이다.
- shell script 실행
파일.sh를 만들고 해당 위치에서 ./bash 파일.sh명령어로 실행할 수 있다.
- 단, 실행권한이 없는 경우
chmod +x 파일.sh로 실행권한을 바꾸고 진행한다.
- 또는
bash 파일.sh로 실행시킬 수도 있다.
#!/bin/bash문이 파일에 없어도 실행된지만 sub shell을 지정하는 것이다.
- 예시
1
2
3
4
|
#!/bin/bash
echo "-----"
date
echo "-----"
|
Positional Parameters
1
2
3
4
5
6
|
#!/usr/bash
echo $0
echo $1
echo $2
echo $@
echo "There are" $# "arguments"
|
bash pos.sh one two 치면 argument들이 들어가는 것이다.
$@는 전체 argument, $#는 argument의 갯수
- 실행결과
1
2
3
4
5
|
pos.sh
one
two
one two
There are 2 arguments
|
echo
- 옵션으로
-e를 사용하면 escape문자를 사용한다. \n, \t 같은 문자가 기능을 한다.
read
read 옵션 변수명명령어를 통해서 사용자에게 직접 변수에 해당하는 값을 입력받는다.
- 예시
echo -n "your name: " ; read name 명령어를 입력하면
your name: 에 커서가 있고 name변수에 해당하는 값을 넣으면 된다.
printf
- format에 맞춰서 출력할 수 있다.
- 예시
today라는 변수에 birthday라는 값이 있다고 가정하면
printf "Today is %d" $today라고 치면 Today is birthday가 나온다.
Branching
exit
- 실행된 프로그램이 종료된 상태를 전달
$?에 직전에 실행한 명령어의 종료상태를 갖고 있다. echo $?하면 볼 수 있는 것이다.
- 0: 성공하고 종료
- 1-255: 실패로 종료
- 2: syntax error
- 126: 명령을 실행할 수 없음
- 127: 명령(파일)이 존재하지 않음
test
- 비교연산자, 명령어 실행결과를 true 또는 false 로 보여준다.
- 사용방법은 2가지 인데
test 비교구문, [ 비교구문 ] 이런식으로 사용한다. (띄어쓰기를 꼭 넣어야함)
- 예시
x가 10이라는 값을 가진다고 하면
test $x -gt 5라는 것은 x가 5보다 크냐는 것이므로 true이다. echo $?를 치면 0이라는 값이 나온다.
- 위와 똑같은 역할을 하는 것이
[ $x -gt 5 ] 명령어이다.
if-then
1
2
3
4
5
6
|
if 조건
then
명령어1
else
명령어2
fi
|
1
2
3
4
5
6
|
x="Queen"
if [ $x == "King" ]; then
echo "$x is a King"
else
echo "$x is not a King"
fi
|
case
- if랑 비슷하지만 조건이 많을 때 사용하면 될듯
- 예시
1
2
3
4
5
6
7
8
|
case $1 in
Monday|Tuesday|Wednesday|Thursday|Friday)
echo "It is a Weekday!";;
Saturday|Sunday)
echo "It is a Weekend!";;
*)
echo "Not a day!";;
esac
|
Loop
while , until
- while은 명령어가 성공하는 동안 반복, until은 성공할 때까지 반복
- while 예시
1
2
3
4
5
6
|
x=1
while [ $x -le 3 ];
do
echo $x
((x+=1))
done
|
for
1
2
3
4
|
for x in {1..5..2}
do
echo $x
done
|
1
2
3
4
|
for book in books/*
do
echo $book
done
|
1
2
3
4
|
for book in $(ls books/ | grep -i 'air')
do
echo $book
done
|
Reference