Linux 셸 스 크 립 트 기초 학습 상세 설명 (전체 버 전) 2
11663 단어 shell
리 눅 스 셸 스 크 립 트 기초 앞에서 리 눅 스 셸 스 크 립 트 의 제어 절 차 를 소개 할 때 일부 내용 은 말 하지 않 고 here document 에 관 한 내용 을 여기 서 계속 합 니 다.
리 눅 스 셸 스 크 립 트 의 기 초 는 이미 여러 부분 으로 나 뉘 었 습 니 다. 여기 서 제어 프로 세 스 의 내용 도 곧 끝 납 니 다. 이것 은 마지막 부분 입 니 다. here document 에 관 한 것 입 니 다. 여기 서 예 를 들 어 약간 복잡 합 니 다. 우 리 는 이 복잡 한 리 눅 스 셸 스 크 립 트 를 천천히 분석 합 니 다.
6. Here documents
명령 에 몇 줄 의 문 자 를 전달 하려 고 할 때 here documens (번역자 주: 아직 이 단어 에 적합 한 번역 을 본 적 이 없다) 좋 은 방법 입 니 다.모든 스 크 립 트 에 도움 이 되 는 문 자 를 쓰 는 데 유용 합 니 다. 이 때 우리 넷 에 그 here documens 가 있다 면 echo 함수 한 줄 로 출력 할 필요 가 없습니다."Here document"은 << < 시작, 뒤에 문자열 을 연결 합 니 다. 이 문자열 은 here document 의 끝 에 나타 나 야 합 니 다.다음은 하나의 예 입 니 다. 이 예 에서 우 리 는 여러 파일 의 이름 을 바 꾸 고 here documens 인쇄 도움말 을 사용 합 니 다.
#!/bin/sh
# we have less than 3 arguments. Print the help text:
if [ $# -lt 3 ] ; then
cat <
ren -- renames a number of files using sed regular expressions
USAGE: ren 'regexp' 'replacement' files...
EXAMPLE: rename all *.HTM files in *.html:
ren 'HTM$' 'html' *.HTM
HELP
exit 0
fi
OLD="$1"
NEW="$2"
# The shift command removes one argument from the list of
# command line arguments.
shift
shift
# $* contains now all the files:
for file in $*; do
if [ -f "$file"] ; then
newfile=`echo "$file"| sed "s/${OLD}/${NEW}/g"`
if [ -f "$newfile"]; then
echo "ERROR: $newfile exists already"
else
echo "renaming $file to $newfile ..."
mv "$file""$newfile"
fi
fi
done
이것 은 좀 복잡 한 예 다.우리 상세 하 게 토론 합 시다.첫 번 째 if 표현 식 은 입력 명령 행 인자 가 3 개 이하 인지 판단 합 니 다 (특수 변수 $\# 매개 변 수 를 포함 하 는 개 수 를 표시 합 니 다).입력 매개 변수 가 3 개 보다 작 으 면 도움말 문 자 를 cat 명령 에 전달 하고 cat 명령 으로 화면 에 인쇄 합 니 다.도움말 문 자 를 인쇄 한 후 프로그램 이 종 료 됩 니 다.입력 매개 변수 가 3 개 이상 이면 첫 번 째 매개 변 수 를 변수 OLD 에 할당 하고 두 번 째 매개 변 수 는 변수 NEW 에 할당 합 니 다.다음 단 계 는 shift 명령 을 사용 하여 첫 번 째 매개 변수 와 두 번 째 매개 변 수 를 매개 변수 목록 에서 삭제 합 니 다. 그러면 원래 의 세 번 째 매개 변 수 는 매개 변수 목록 $* 의 첫 번 째 매개 변수 가 됩 니 다.그리고 명령 행 매개 변수 목록 이 변수 $file 에 하나씩 할당 되 는 순환 을 시작 합 니 다.이 어 이 파일 이 존재 하 는 지 여 부 를 판단 합 니 다. 존재 하면 sed 명령 검색 과 대 체 를 통 해 새로운 파일 이름 을 만 듭 니 다.그리고 짧 은 사선 내 명령 결 과 를 new file 에 할당 합 니 다.이렇게 해서 우 리 는 우리 의 목적 을 달성 했다. 오래된 파일 이름과 새 파일 이름 을 얻 었 다.그리고 뮤 직 비디오 명령 으로 이름 을 바 꿉 니 다.이렇게 하면 이 복잡 한 리 눅 스 셸 스 크 립 트 를 알 수 있 겠 지.
리 눅 스 셸 스 크 립 트 기초 학습 (6) 리 눅 스 셸 스 크 립 트 기초 학습 을 상세 하 게 소개 합 니 다. 우 리 는 여기 서 거의 다 말 하지 못 했 습 니 다. 마지막 부분 은 함수 에 관 한 것 입 니 다. 이것 은 기본 부분 을 다 소개 할 뻔 했 습 니 다. 그 다음 에 인 스 턴 스 가 있 을 것 입 니 다.
4) 함수
만약 당신 이 약간 복잡 한 프로그램 을 썼 다 면, 프로그램 에서 몇 군데 에서 같은 코드 를 사 용 했 을 수도 있 고, 우리 가 함 수 를 사용 했다 면 매우 편리 할 수도 있다 는 것 을 알 게 될 것 입 니 다.하나의 함수 가 이 모양 입 니 다:
functionname()
{
# inside the body $1 is the first argument given to the function
# $2 the second ...
body
}
모든 프로그램의 시작 에 함수 에 대해 설명 을 해 야 합 니 다.
다음은 xtitlebar 라 는 스 크 립 트 입 니 다. 이 스 크 립 트 를 사용 하면 터미널 창의 이름 을 바 꿀 수 있 습 니 다.
여기 서 help 라 는 함 수 를 사 용 했 습 니 다.보시 다시 피 이 정의 함 수 는 두 번 사용 되 었 습 니 다.
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat <
xtitlebar -- change the name of an xterm, gnome-terminal or kde konsole
USAGE: xtitlebar [-h] "string_for_titelbar"
OPTIONS: -h help text
EXAMPLE: xtitlebar "cvs"
HELP
exit 0
}
# in case of error or if -h is given we call the function help:
[ -z "$1"] && help
[ "$1"= "-h"] && help
# send the escape sequence to change the xterm titelbar:
echo -e "33]0;$107"
#
스 크 립 트 에 도움 을 주 는 것 은 다른 사용자 가 스 크 립 트 를 사용 하고 이해 할 수 있 도록 좋 은 프로 그래 밍 습관 입 니 다.
명령 행 인자
$* 와 $1, $2... $9 등 특수 변 수 를 만 났 습 니 다. 이 특수 변 수 는 사용자 가 명령 행 에서 입력 한 인 자 를 포함 합 니 다.지금까지 우 리 는 간단 한 명령 행 문법 (예 를 들 어 강제 적 인 매개 변수 와 도움말 을 보 는 - h 옵션) 만 알 고 있 었 다.하지만 더 복잡 한 프로그램 을 만 들 때 사용자 정의 옵션 이 더 필요 할 수도 있 습 니 다.일반적인 관례 는 모든 선택 할 수 있 는 매개 변 수 를 추가 하기 전에 마이너스 번 호 를 추가 하고 그 다음 에 매개 변수 값 (예 를 들 어 파일 이름) 을 추가 하 는 것 이다.
.
입력 매개 변수 에 대한 분석 을 실현 할 수 있 는 방법 은 여러 가지 가 있 지만, 아래 의 case 표현 식 을 사용 하 는 예 는 남김없이 좋 은 방법 이다.
#!/bin/sh
help()
{
cat <
This is a generic command line parser demo.
USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2
HELP
exit 0
}
while [ -n "$1"]; do
case $1 in
-h) help;shift 1;; # function help is called
-f) opt_f=1;shift 1;; # variable opt_f is set
-l) opt_l=$2;shift 2;; # -l takes an argument -> shift by 2
--) shift;break;; # end of options
-*) echo "error: no such option $1. -h for help";exit 1;;
*) break;;
esac
done
echo "opt_f is $opt_f"
echo "opt_l is $opt_l"
echo "first arg is $1"
echo "2nd arg is $2"
이 스 크 립 트 를 이렇게 실행 할 수 있 습 니 다:
cmdparser -l hello -f -- -somefile1 somefile2
돌아 온 결 과 는:
opt_f is 1
opt_l is hello
first arg is -somefile1
2nd arg is somefile2
이 대본 은 어떻게 작 동 합 니까?스 크 립 트 는 우선 모든 입력 명령 행 매개 변수 에서 순환 합 니 다. 입력 매개 변 수 를 case 표현 식 과 비교 하고 일치 하면 변 수 를 설정 하고 이 매개 변 수 를 제거 합 니 다.유 닉 스 시스템 의 관례 에 따라 먼저 입력 한 것 은 감 호 를 포함 하 는 매개 변수 입 니 다.
리 눅 스 셸 스 크 립 트 기초 학습 (7) 리 눅 스 셸 스 크 립 트 기초 학습 이론 지식 을 상세 하 게 소개 합 니 다. 그 다음은 두 개의 구체 적 인 사례 입 니 다. 여기 서 바 이 너 리 가 언제 금 지 될 지 에 대한 첫 번 째 전환 을 말씀 드 리 겠 습 니 다.리 눅 스 셸 스 크 립 트 기초 학습 이 부분 은 앞의 이론 부분 만 보면 예 가 있 지만 시스템 이 부족 합 니 다. 여기 서 구체 적 인 사례 로 리 눅 스 셸 스 크 립 트 프로 그래 밍 을 보 여 주 며 리 눅 스 셸 기반 의 학습 과 향상 을 도 울 것 입 니 다.두 번 째 부분 인 스 턴 스 는 이제 스 크 립 트 를 만 드 는 일반적인 절 차 를 토론 합 니 다.모든 우수한 스 크 립 트 는 도움말 과 입력 인자 가 있어 야 합 니 다.또한 가짜 스 크 립 트 (framework. sh) 를 작성 합 니 다. 이 스 크 립 트 는 대부분의 스 크 립 트 가 필요 로 하 는 프레임 구 조 를 포함 하고 있 습 니 다. 아주 좋 은 생각 입 니 다.이 때, 새로운 스 크 립 트 를 쓸 때, 우 리 는 copy 명령 을 실행 하기 만 하면 됩 니 다: cp framework. 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
하나의 이 진 수 를 얻 기 위해 서 우 리 는 lastchar 함 수 를 사용 했다.이 함 수 는 wc – c 를 사용 하여 문자 개 수 를 계산 한 다음 cut 명령 을 사용 하여 마지막 문 자 를 꺼 냅 니 다.Chop 함수 의 기능 은 마지막 문 자 를 제거 하 는 것 입 니 다.
이 Linux 셸 스 크 립 트 인 스 턴 스 는 변환 을 완 료 했 습 니 다. 다음 에는 파일 순환 프로그램 을 예 로 들 겠 습 니 다.
Linux 셸 스 크 립 트 기초 학습 자세히 소개 (8)
Linux 셸 스 크 립 트 기초 학습 인 스 턴 스 앞에서 10 진법 과 2 진법 의 전환 을 설명 하 였 습 니 다. 여기 서 마지막 예 를 들 어 파일 의 순환 에 관 한 동시에 디 버 깅 을 어떻게 하 는 지 설명 하여 우리 의 과정 을 끝 냅 니 다.
Linux 셸 스 크 립 트 앞의 인 스 턴 스 는 10 진법 과 2 진법 의 변환 을 설명 하고 파일 순환 에 관 한 인 스 턴 스 로 이 부분의 학습 을 끝 냅 니 다.Linux 셸 스 크 립 트 의 기초 학습 자 는 간단 한 Linux 셸 스 크 립 트 의 작성 을 파악 할 수 있 을 것 이 라 고 믿 습 니 다.파일 순환 프로그램
한 파일 에 보 낸 모든 메 일 을 저장 하고 싶 은 사람 중 한 명 일 수도 있 습 니 다. 하지만 몇 달 이 지나 면 이 파일 은 접근 속도 가 느 려 질 수도 있 습 니 다.아래 스 크 립 트 rotatefile 은 이 문 제 를 해결 할 수 있 습 니 다.이 스 크 립 트 는 메 일 저장 파일 (outmail 로 가정) 을 outmail. 1 로 바 꿀 수 있 으 며, outmail. 1 에 대해 서 는 outmail. 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 9 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
이 대본 은 어떻게 작 동 합 니까?사용자 가 파일 이름 을 제공 한 것 을 검사 한 후에 우 리 는 9 에서 1 의 순환 을 진행 합 니 다.파일 9 은 10, 파일 8 은 9 등 으로 이름 이 바 뀌 었 다.순환 이 끝 난 후에 우 리 는 원본 파일 을 파일 1 이 라 고 명명 하고 원본 파일 과 같은 이름 의 빈 파일 을 만 듭 니 다.
디 버 깅
가장 간단 한 디 버 깅 명령 은 당연히 echo 명령 을 사용 하 는 것 이다.echo 를 사용 하여 오류 가 의심 되 는 곳 에 변 수 를 인쇄 할 수 있 습 니 다.대부분의 셸 프로그래머 들 이 프로그램 을 디 버 깅 하 는 데 80% 의 시간 을 들 여야 하 는 이유 이기 도 하 다.셸 프로그램의 장점 은 재 컴 파일 이 필요 없고 echo 명령 을 삽입 하 는 데 시간 이 얼마 걸 리 지 않 는 다 는 것 이다.
셸 에 도 실제 디 버 깅 모드 가 있다.스 크 립 트 "strangescript"에서 오류 가 발생 하면 디 버 깅 을 할 수 있 습 니 다.
sh -x strangescript
이 스 크 립 트 를 실행 하고 모든 변수의 값 을 표시 합 니 다.
셸 은 스 크 립 트 를 실행 하지 않 고 문법 만 검사 하 는 모드 도 있 습 니 다.이렇게 사용 가능:
sh -n your_script
모든 문법 오 류 를 되 돌려 줍 니 다.
여기 리 눅 스 셸 스 크 립 트 기초 학습 이 모두 끝 났 습 니 다.여러분 의 지지 에 감사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZSH에서 물고기까지ZSH는 수년 동안 내 기본 셸이었습니다. 이제 몇 달 동안 사용하면서 ZSH 구성에 대해 몇 가지 사항을 발견했습니다. 우리는 을 제공하는 시스템과 더 빨리 상호 작용하는 경향이 있습니다. 내.zshrc 구성에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.