230113 - Linux

su-mmer·2023년 1월 16일
0

리눅스

목록 보기
9/9

Shell

shell의 기능

  • 명령어 해석기
  • 프로그래밍: shell 스크립트
  • 사용자 환경설정

shell 기본 사용법

/etc/passwd에 위치

로그인 shell

서브 shell: 사용자가 프롬프트에서 다른 셸을 실행하여 생긴 셸

사용법

출력

echo 입력받은 대로 출력(개행있음)
printf 개행 없이 입력받은 대로 출력

특수문자

ls
cp
/tmp
ls -F t
cp
.txt _/ch3
ls -l h*d

? 한글자 대체
[]

; 차레대로 명령 실행
| 명령을 전달해서 실행

''
""
`` 가 명령으로 해석된다.
\
> 왼쪽의 결과를 오른쪽 파일에 덮어씀
>> 왼쪽의 결과를 오른쪽 파일에 이어붙임
< 오른쪽 파일을 왼쪽 명령어로 실행

입출력 방향 변경

출력 리다이렉션

> 파일 덮어쓰기
0< 표준입력
1> 표준출력을 오른쪽 파일에 저장
2> 표준에러를 오른쪽 파일에 저장

환경변수

숫자도 문자로 읽는다. 띄어쓰기는 못 알아먹으니까 ""로 감싸주어야한다. $가 들어간 문자를 출력하려면 묶어주거나 \을 붙인다.

myvar="Hi Woo"
echo $myvar
echo "$myvar"
echo '$myvar'
echo \$myvar
read myvar
echo '$myvar'=$myvar
testval=7+10
echo $testval
#!/bin/sh
num1=100
num2=$num1 + 200
echo $num2
num3=`expr $num1 +  200`
echo $num3
num4=`expr  \(  $num1 + 200  \) / 10  \*  2`
echo $num4
exit 0

if-else 문

if [조건]
then
참일 경우 실행
else
거짓인 경우 실행
fi

#!/bin/sh
if [ "woo" != "woo" ]
then
    echo "참입니다"
else
   echo "거짓입니다"
fi
exit 0

비교 연산자

#!/bin/sh
if [ 100 -eq 200 ]
then
   echo "100과 200은 같다."
else
   echo "100과 200은 다르다."
fi
exit 0

파일과 관련된 조건

#!/bin/sh
fname=/lib/systemd/system/cron.service
if [ -f $fname ]
then
   head -5 $fname
else
   echo "cron 서버가 설치되지 않았습니다."
fi
exit 0

case~esac문

  • if문은 참과 거짓만 가능
  • 여러가지 경우의 수일 경우 case문 사용
#!/bin/sh
case "$1" in
   start)
      echo "시작~~";;
   stop)
      echo "중지~~";;
   restart)
      echo "다시 시작~~";;
   *)
      echo "뭔지 모름~~";;
esac
exit 0
#!/bin/sh
echo "리눅스가 재미있나요? (yes / no)"
read answer
case $answer in
   yes | y | Y | Yes | YES)
      echo "다행입니다."
      echo "더욱 열심히 하세요 ^^";;
   [nN]*)
      echo "안타깝네요. ㅠㅠ";;
   *)
      echo "yes 아니면 no만 입력했어야죠"
      exit 1;;
esac
exit 0

and, or 연산자

#!/bin/sh
echo "보고 싶은 파일명을 입력하세요."
read fname
if [ -f $fname ] && [ -s $fname ] ; then
   head -5 $fname
else
   echo "파일이 없거나, 크기가 0입니다."
fi
exit 0

for ~ in 문

for 변수 in 값1 값2 ..
do
	반복할 문장
done
#!/bin/sh
hap=0
for i in 1 2 3 4 5 6 7 8 9 10
do
   hap=`expr $hap + $i`
done
echo "1부터 10까지의 합: "$hap
exit 0
#!/bin/sh
for fname in $(ls *.sh)
do
   echo "--------$fname-------"
   head -3 $fname
done
exit 0

while문

#!/bin/sh
while [ 1 ]
do
   echo “우분투 16.04 LTS”
done
exit 0
#!/bin/sh
hap=0
i=1
while [ $i -le 10 ]
do
   hap=`expr $hap + $i`
   i=`expr $i + 1`
done
echo "1부터 10까지의 합 : "$hap
exit 0
#!/bin/sh
echo "비밀번호를 입력하세요."
read mypass
while [ $mypass != "1234" ]
do
   echo "틀렸음. 다시 입력하세요."
   read mypass
done
echo "통과~~"
exit 0

그 외

  • until
  • break, continue, exit, return
#!/bin/sh
echo "무한반복 입력을 시작합니다(b: break, c: continue, e: exit)"
while [ 1 ] ; do
read input
case $input in
    b | B )
        break ;;
    c | C )
        echo "continue를 누르면 while의 조건으로 돌아감"
        continue ;;
    e | E )
        echo "exit를 누르면 프로그램(함수)를 완전히 종료함"
        exit 1 ;;
esac;
done
echo "break를 누르면 while을 빠져나와 지금 이 문장이 출력됨."
exit 0
#!/bin/sh
hap=0
i=1
until [ $i -gt 10 ]
do
   hap=`expr $hap + $i`
   i=`expr $i + 1`
done
echo "1부터 10까지의 합 : "$hap
exit 0

사용자 정의 함수

func_name() {
	definition
    $1, $2등 사용
}
func_name 10 20 <- call
#!/bin/sh
hap () {
   echo `expr $1 + $2`
}
echo "10 더하기 20을 실행합니다"
hap 10 20
exit

eval

  • 문자열을 명령문으로 인식하고 실행
#!/bin/sh
str="ls -l test18.sh"
echo $str
eval $str
exit 0

export

  • 외부 변수로 선언, 다른 프로그램에서도 사용할 수 있도록 함.
// test1.sh
#!/bin/sh
echo $var1
echo $var2
exit 0
// test2.sh
#!/bin/sh
var1="지역 변수"
export var2="외부 변수"
sh test1.sh
exit 0

set, $

  • 리눅스 명령어를 결과를 사용하기 위해서는 $형식 사용
  • 결과를 파라미터에 저장
echo "오늘 날짜는 $(date)입니다."
set $(date)
echo "오늘은 $4요일 입니다."
exit 0

shift

  • 파라미터 변수를 왼쪽으로 한 단계씩 아래로 이동(shift)
#!/bin/sh
myfunc() {
    str=""
    while [ "$1" != "" ] ; do
        str="$str $1"
        shift
    done
    echo $str
}
myfunc AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK
exit 0

0개의 댓글