Shell (2023.01.13)

최시열·2023년 1월 25일
1

  • 셸의 기능

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

기본 사용법

  • 사용자의 기본 셸은 /etc/passwd 파일에 저장
  • 서브 셸: 사용자가 프로ㅁ프트에서 다른 셸을 실행하여 생성한 셸
  • 여러개의 서브 셸을 사슬 처럼 연결 가능
  • exit 또는 ctrl+d로 서브셸을 탈출
  • 셸 내장 명령
    • 셸 자체적으로 가지고 있는 명령
    • ex) cd..
  • 출력명령

    • echo : 화면에 한줄의 문자열을 출력한다.
    • printf : 자료를 형식화하여 화면에 출력한다.
  • 특수문자

    • ls *: 현재 디렉터리의 모든 파일과 서브 딜렉터리를 나열, 서브디렉터리의 내용도 출력

    • cp *.txt ../tmp2: 부모 디렉터리의 tmp2 디렉터리에 .txt로 끝나는 모든 파일을 복사한다.

    • ls -F t*: t를 포함한 t로 시작하는 모든 파일의 이름과 파일 종류를 출력

    • ls -l h*d: h로 시작해 d로 끝나는 모든 파일 출력

    • ls p?.txt : p 다음에 한글자가 오는 모든 파일을 찾음

    • ls -l tmp[123].txt

    • ls [A-Za-z][0-9]: 파일명이 영문자로 시작 숫자로 끝 ex) `ls [a-p][1-3].txt`

    • date;ls;pwd: 3개의 명령어 연속으로 출력

    • ls -al /etc |more : 왼쪽의 실행 결과(ls -al /etc)를 오른쪽(more)으로 넘겨줌

    • echo $PATH, ehco $SSH_TTY: 변수의 값을 보여줌

    • echo "Today is (백틱)date(백틱)": date를 실행해줌

    파이썬 f스트링 느낌 {}

    • cp tmp.sh t\: 과 같은 특수문자를 파일명에 넣으려면 백슬래시가 들어가야 함

    • cat < tmp: cat 명령의 입력을 tmp 파일에서 받는다.



입출력 방향 변경

  • 출력 리다이렉션

    • 명령의 결과를 화면 출력이 아닌 파일에 저장
    • 파일 덮어쓰기: >
    • 파일에 append: >>
    • set -o noclobber : 덮어쓰기(>) 불가능
    • set +o noclobber : 덮어쓰기(>) 가능
    • ls -l /abc > ls.out 2> ls.err: (/abc는 없는 상태)

셸 스크립트의 프로그래밍

  • 변수

    • 변수 할당 시 = 전후에 공백이 있으면 안된다
    • 공백을 변수에 할당하고 싶을 때 ""으로 막아줘야 한다.
    • 숫자를 넣어도 연산하지 않음!
    • $문자가 들어간 글자를 출력하려면 ''로 묶어주거나 앞에 \를 붙임(""도 가능)

예제

cat > test1.sh

#!/bin/sh
myvar = 'Hi Choi'
echo $myvar
echo "$myvar"
echo '$myvar'
echo \$myvar
read myvar
echo '$myvar' = $myvar
exit 0

ctrl+d

bash test1.sh

cat > test2.sh

\#!/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

ctrl+d

bash test2.sh

cat > test3.sh

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

ctrl+d

bash test3.sh

cat > test4.sh

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

ctrl+d

bash test4.sh

cat > test5.sh

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

ctrl+d

bash test5.sh

cat > test6.sh

#!/bin/sh
case "$1" in
  start)
   echo "시작";;
  stop)
   echo "중지";;
  restart)
   echo "다시 시작";;
  *)
   echo "뭔지 모름";;
esac
exit 0

ctrl+d

bash test6.sh

cat > test7.sh

\#!/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

ctrl+d

bash test7.sh

cat > test8.sh

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

ctrl+d

bash test8.sh

cat > test9.sh

\#!/bin/sh
hap=0
for i in 1 2 3 4 5 6 7 8 9 10
do (do~done까지 반복할 부분)
  hap=`expr $hap + $i`
done
echo "1부터 10까지의 합: "$hap
exit 0

ctrl+d

bash test9.sh

cat > test10.sh

\#!/bin/sh
for fname in $(ls *.sh)
do
  echo "--------$fname-------"
  head -3 $fname
done
exit 0

ctrl+d

bash test10.sh

\#!/bin/sh
while [ 1 ]
do
  echo “우분투 16.04 LTS”
done
exit 0

\#!/bin/sh
hap=0
i=1
while [ $i -le 10 ]

(until [ $i -gt 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 문은 while과 용도는 같으나 반대로 거짓일때만 반복한다.

  • 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 () {
  echo `expr $1 + $2`
}
echo "10 더하기 20을 실행합니다"
hap 10 20
exit 0

#!/bin/sh
str="ls -l test18.sh"
echo $str
eval $str
exit 0

#!/bin/sh
echo $var1
echo $var2
exit 0



#!/bin/sh
var1="지역변수"
export var2 ="외부변수"
sh exp1.sh
exit 0

#!/bin/sh
var1=100.5
var2="재미있는 리눅스"
printf "%5.2f \n\n \t %s \n" $var1 "$var2"
exit 0

#!/bin/sh
echo "오늘 날짜는 $(date) 입니다"
set $(date)
echo "오늘은 $4 요일입니다."
exit 0

\#!/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
profile
최시열

0개의 댓글