리눅스의 많은 부분과 서버 데몬 스크립트는 쉘 스크립트로 되어있음.
별도로 컴파일 하지 않고 텍스트 파일 형태로 바로 실행.
파일명.sh (꼭 이렇게 안해도 실행이 되긴 하나 관례임)
첫줄에 #!/bin/sh
이렇게 작성. 관례임. /bin/sh를 이용해 실행한단 뜻임.
저장 시 실행 접근권한이 없는데, 원하는 대로 chmod로 수정
실행
sh 파일명.sh
아니면 실행권한이 있는 상태서 ./파일명.sh로 실행 가능
근데 이게 만약 이 파일이 있는 디렉토리를 $PATH에 등록하면 파일명.sh 만으로도 실행 가능.
인터프리터 방식이라, 변수를 미리 선언하지 않고 필요할 때 값을 할당하면서 사용
모든 변수는 문자열로 취급
testval=7+5
echo $testval
"7+5"로 나옴
변수에 값 대입할 때 = 좌우에 공백이 없어야 함.
공백 있는 값 대입시에는 " "안에 써줘야 함
myVar="Hi Woo"
echo $myVar //Hi Woo 출력
echo "$myVar" //Hi Woo 출력
echo '$myVar' //$myVar 출력
echo \$myVar //$myVar 출력
쌍따옴표 안의 변수는 변수로 취급. 그렇게 안하고 싶으면 \붙이면 됨.
myVar="Hi"
echo "$myVar human"
Hi human
echo 때 " 출력하고 싶은 \"
입력문
read 변수명
선언 할 때는 $ 안씀.
숫자계산.
말 했듯이 모든 변수값은 string임.
계산 하려면
expr
expr은 역따옴표(숫자1 왼쪽) 안을 수식으로 처리.
expr 쓸 때 괄호 또는 * 앞에는 꼭 \붙임. ( 괄호 쓸 때는 \( ~~~ \) 이렇게 )
`expr 100 + 200`
`expr \( $num1 + 200 \) / 10 \* 2`
이거 쓸 때는 오히려 단어 사이들에 다 띄어쓰기 해줘야 함. 사칙연산 키워드, 괄호도 포함.
파라미터
인자를 받고 싶을 때는
$0, $1 이런 식으로 쓰면 됨.
이렇게 하면 각 모든 명령이 저 인자로 들어감.
예를 들어
cp man1.txt man2.txt
하면은 cp가 $0이 되고, man1.txt가 $1이 되고, man2.txt가 $2가 된다.
$*는 모든 변수이다.
각자 공백으로 구분해서 출력해준다.
조건문
if문
if [ "woo" = "woo" ] //조건 안쪽에는 단어와 단어 사이에 공백을 반드시 넣어줘야 함.
then
echo "참입니다."
fi
if [ 조 건 ]
then
~~~//참일 경우의 내용
fi //조건문 끝내기
else문
if [ 조 건 ]
then
~~~//참일 경우
else
~~~//거짓일 경우
fi
if문은 참과 거짓 두 분기만 다룸.
case ~ esac 여러 분기를 다룸.
비교 연산자.
문자열 비교
산술 비교
if [ 100 -eq 100 ]
then
echo "같습니다."
else
echo "다릅니다."
fi
파일 관련 비교 연산자
case~esac
case "$1" in
start)
echo "시작합니다~~";;
stop)
echo "중지~~";;
esac
case 조건 in
첫번째케이스)
~~~~ ;; // ;;는 ~~~~까지 하고 끝내겠다는 뜻.
두번째케이스)
~~~~ ;;
esac // 닫기
*) 그 외의 모든 케이스.
case "$1" in
start)
echo "시작합니다~~";;
stop)
echo "중지~~";;
*)
echo "모름~";;
esac
case 용 or
case $answer in
yes | y | Yes | YES | Y)
echo "대단해요!";;
[nN]*)
echo "아까워요.";;
*)
echo "제대로 입력하세요!";;
esac
and or
if [ 100 -gt 50 ] && [ 100 -lt 150]
then
echo "범위 내 입니다."
else
echo "범위를 벗어났습니다."
fi
-a (&&)
-o (||)
도 가능.
반복문
for문
hap=0
for i in 1 2 3 4 5 6 7
do
hap=`expr $hap + $i`
done
echo " 1 ~ 7 : "$hap
for 인덱스로쓸변수 in 인덱스변수에들어갈값들
do // 여기서 부터 해라
~~~~~
done // 여기까지 끝내라
while [ 조 건 ]
do
~~~~~
done
while [ 1 ] //무한반복
while, if 다음 띄어쓰기 해야 함.
배열
배열이름=(값1 값2 값3)
array=(1 2 3 4)
접근
${배열이름[인덱스]}
$배열이름
첫번째 인덱스의 값만 출력
여러 배열
array="A B C D"
array={1..100} //1~100까지
array={1..100..5} //1~100까지 중 5씩 띄어서. 1,6, 11
for i in array
for i in {1..100}
until [ 조 건 ]
while이랑 같은데 대신 조건이 거짓인 동안 반복
break, continue, return 사용 가능.
함수 만들기
myFunction(){
~~~~~~
return
}
함수 부르기
myFunction
함수 콜 시에는 괄호는 딱히 안씀.
인자 넣기
myFunction(){
echo `expr $1 + $2`
return
}
부르기
myFunction $1 $2
인자를 저렇게 넣어 부른다.
괄호는 단지 이거 함수라는 표시인 듯.
그리고
꼭 함수 구현 후에 사용 해야 함. 절차지향적? C같은..
근데 myFunction(); 처럼 먼저 선언해주는 건 안됨.
그냥 위쪽에 구현 자체를 한 후에 사용할 수 있음.