두 개의 상세한 셸 실례 코드

5089 단어 shell
두 개의 상세한 셸 실례 일반 프로그래밍 절차입니다. 이제 스크립트를 작성하는 일반적인 절차를 토론합시다.모든 우수한 스크립트는 도움말과 입력 매개 변수를 가지고 있어야 한다.그리고 위조 스크립트 (framework.sh) 를 쓴다. 이 스크립트는 대부분의 스크립트가 필요로 하는 프레임워크 구조를 포함하고 있어 아주 좋은 생각이다.이 때, 새로운 스크립트를 쓸 때, 우리는copy 명령을 실행하기만 하면:cp 프레임워크를 실행할 수 있습니다.sh myscript 다음에 자신의 함수를 삽입합니다.두 가지 예를 다시 봅시다. 2진수에서 10진수로 전환하는 스크립트 b2d는 2진수 (예를 들어 1101)를 상응하는 10진수로 전환합니다.이것도 expr 명령으로 수학 연산을 하는 예이다
 
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
 cat < b2h -- convert binary to decimal
USAGE: b2h [-h] binarynum
OPTIONS: -h help text
EXAMPLE: b2h 111010
will return 58
HELP
 exit 0
}
error()
{
  # print an error and exit
  echo "$1"
  exit 1
}
lastchar()
{
  # return the last character of a string in $rval
  if [ -z "$1" ]; then
    # empty string
    rval=""
    return
  fi
  # wc puts some space behind the output this is why we need sed:
  numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
  # now cut out the last char
  rval=`echo -n "$1" | cut -b $numofchar`
}
chop()
{
  # remove the last character in string and return it in $rval
  if [ -z "$1" ]; then
    # empty string
    rval=""
    return
  fi
  # wc puts some space behind the output this is why we need sed:
  numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
  if [ "$numofchar" = "1" ]; then
    # only one char in string
    rval=""
    return
  fi
  numofcharminus1=`expr $numofchar "-" 1`
  # now cut all but the last char:
  rval=`echo -n "$1" | cut -b 0-${numofcharminus1}`
}
while [ -n "$1" ]; do
case $1 in
  -h) help;shift 1;; # function help is called
  --) shift;break;; # end of options
  -*) error "error: no such option $1. -h for help";;
  *) break;;
esac
done
# The main program
sum=0
weight=1
# one arg must be given:
[ -z "$1" ] && help
binnum="$1"
binnumorig="$1"
while [ -n "$binnum" ]; do
  lastchar "$binnum"
  if [ "$rval" = "1" ]; then
    sum=`expr "$weight" "+" "$sum"`
  fi
  # remove the last position in $binnum
  chop "$binnum"
  binnum="$rval"
  weight=`expr "$weight" "*" 2`
done
echo "binary $binnumorig is decimal $sum"
#
이 스크립트가 사용하는 알고리즘은 10진법과 2진수 권한 값(1,2,4,8,16,...)을 이용하여예를 들어 2진법'10'은 이렇게 10진법으로 변환할 수 있다. 0 * 1 + 1 * 2 = 2는 하나의 2진수를 얻기 위해lastchar 함수를 사용했다.이 함수는 wc를 사용합니까?c 문자 수를 계산한 다음cut 명령을 사용하여 마지막 문자를 꺼냅니다.Chop 함수의 기능은 마지막 문자를 제거하는 것입니다.파일 순환 프로그램은 보내는 모든 메일을 파일에 저장하고 싶은 사람들 중 한 명일지도 모르지만, 몇 달이 지나면 파일에 대한 접근 속도가 느려질 수 있습니다.다음 스크립트rotatefile에서 이 문제를 해결할 수 있습니다.이 스크립트는 메일 저장 파일 (outmail이라고 가정) 을 outmail로 바꿀 수 있습니다.1, 그리고 outmail.1은 아웃메일이 됩니다.2, 잠깐만, 잠깐만..
 
#!/bin/sh
# vim: set sw=4 ts=4 et:
ver="0.1"
help()
{
  cat < rotatefile -- rotate the file name
USAGE: rotatefile [-h] filename
OPTIONS: -h help text
EXAMPLE: rotatefile out
This will e.g rename out.2 to out.3, out.1 to out.2, out to out.1
and create an empty out-file
The max number is 10
version $ver
HELP
  exit 0
}
error()
{
  echo "$1"
  exit 1
}
while [ -n "$1" ]; do
case $1 in
  -h) help;shift 1;;
  --) break;;
  -*) echo "error: no such option $1. -h for help";exit 1;;
  *) break;;
esac
done
# input check:
if [ -z "$1" ] ; then
error "ERROR: you must specify a file, use -h for help"
fi
filen="$1"
# rename any .1 , .2 etc file:
for n in Array 8 7 6 5 4 3 2 1; do
  if [ -f "$filen.$n" ]; then
    p=`expr $n + 1`
    echo "mv $filen.$n $filen.$p"
    mv $filen.$n $filen.$p
  fi
done
# rename the original file:
if [ -f "$filen" ]; then
  echo "mv $filen $filen.1"
  mv $filen $filen.1
fi
echo touch $filen
touch $filen
이 스크립트는 어떻게 작동합니까?사용자가 파일 이름을 제공한 것을 검사한 후에, 우리는 Array에서 1로 순환합니다.파일 Array는 10, 파일 8은 Array로 이름을 바꿉니다.순환이 끝나면 원본 파일을 파일 1로 명명하고 원본 파일과 같은 이름의 빈 파일을 만듭니다.디버깅의 가장 간단한 디버깅 명령은 당연히 echo 명령을 사용하는 것이다.echo를 사용하여 오류가 의심되는 곳에서 변수 값을 출력할 수 있습니다.이것도 절대 다수의 셸 프로그래머들이 80%의 시간을 들여 프로그램을 디버깅해야 하는 이유이다.셸 프로그램의 장점은 다시 컴파일할 필요가 없고, 에코 명령을 삽입하는 데도 시간이 얼마 걸리지 않는다는 것이다.셸도 실제 디버깅 모드가 있습니다.스크립트 "strangescript"에 오류가 있으면, 디버깅을 할 수 있습니다:sh-xstrangescript 이 스크립트를 실행하고 모든 변수의 값을 표시합니다.셸은 스크립트를 실행하지 않고 문법만 검사하는 모드가 있습니다.이렇게 사용할 수 있습니다:sh-n your_script는 모든 문법 오류를 되돌려줍니다.우리는 당신이 지금 당신의 셸 스크립트를 쓰기 시작할 수 있기를 바랍니다. 당신이 즐겁게 놀기를 바랍니다.

좋은 웹페이지 즐겨찾기