$ i=0;$ ((i++))$ echo $i1$ let i++$ echo $i2$ expr $i + 13$ echo $i2$ echo $i 1 awk '{printf $1+$2}'3
설명하다:
특급~ 후에
$i,
+, 1은 공백으로 구분됩니다. 곱셈이 수행되면 연산자를 이스케이프해야 합니다. 그렇지 않으면 셸이 곱셈 기호를 와일드카드 문자로 해석하여 구문 오류가 발생합니다.
앗뒤에
$1그리고
$2각각 참조
$i1, 즉 왼쪽에서 오른쪽으로 첫 번째와 두 번째 숫자입니다.
Shell의 내장 명령을 사용하여 다음과 같이 각 명령의 유형을 확인하세요.
$ 유형 typetype은 쉘 내장$ 유형 letlet은 쉘 내장$ 유형 exprexpr은 해시됨(/usr/bin/expr)$ 유형 bcbc는 해시됨(/usr/bin/bc)$ 유형 awkawk는 /usr/bin/awk
위의 데모에서 볼 수 있습니다.
허락하다Shell에 내장된 명령이고, 나머지 몇 가지는 외부 명령입니다.
/usr/빈예배 규칙서. 그리고
특급그리고
기원전방금 사용했기 때문에 메모리에 로드되었습니다.
해시시테이블. 이는 이전 장에서 소개한 다양한 스크립트 실행 방법의 원리를 이해하는 데 도움이 됩니다.
참고: 다양한 명령에 대한 도움말을 보려면
허락하다그리고
유형Shell 내장 명령을 기다리면 Shell 내장 명령을 사용할 수 있습니다.
돕다관련 도움말을 볼 수 있으며 일부 외부 명령은 Shell의 외부 명령을 통해 액세스할 수 있습니다.
남성도움말, 사용법 등을 보려면
도와주세요,
manexpr기다리다.
#!/bin/bash# calc.shi=0;while [ $i -lt 10000 ]do ((i++)) doneeecho $i
설명: 여기를 통과하세요
while [조건식] do .... 완료달성하기 위해 순환합니다.
-lt부호보다 작다
<, 자세한 내용은 참조
시험명령 사용법:
남자 테스트.
이 스크립트를 실행하는 방법은 무엇입니까?
방법 1: 스크립트 파일을 하위 Shell(Bash)의 매개변수로 직접 전달
$ bash calc.sh$ 유형 bashbash는 해시됩니다(/bin/bash).
방법 2: 통과
세게 때리다내장 명령
.또는
원천구현하다
$ ./calc.sh
또는
$ source ./calc.sh$ type ..은 쉘 내장$ 유형 sourcesource는 쉘 내장입니다.
방법 3: 파일을 실행 가능하도록 수정하고 현재 셸에서 직접 실행합니다.
$ chmod ./calc.sh $ ./calc.sh
다음으로, 변수 더하기 1을 계산하기 위해 다른 방법을 사용하는 방법을 하나씩 보여드리겠습니다.
((i++))다음 중 하나와 일치합니다.
let i++;i=$(expr $i + 1)i=$(echo $i+1|bc)i=$(echo $i 1 | awk '{printf $1+$2;}')
비교 계산 시간은 다음과 같습니다.
$ 시간 calc.sh10000real 0m1.319suser 0m1.056ssys 0m0.036s$ 시간 calc_let.sh10000real 0m1.426suser 0m1.176ssys 0m0.032s$ 시간 calc_expr.sh1000real 0m27.425suser 0m5.060ssys 0m14.177s$ 시간 calc_bc.sh1000real 0m56.576suser 0m9.353ssys 0m24.618s$ 시간 ./calc_awk.sh100real 0m11.672suser 0m2.604ssys 0m2.660s
설명하다:
시간명령을 사용하여 명령 실행 시간을 계산할 수 있습니다. 이 부분에는 총 실행 시간, 사용자 공간 실행 시간 및 커널 공간 실행 시간이 포함됩니다.
ptrace시스템 호출 구현.
위의 비교를 통해 알 수 있는 것은
(())가장 높은 운영 효율성을 가지고 있습니다. 그리고
허락하다Shell 내장 명령으로도 매우 효율적이지만,
특급,
기원전,
앗계산 효율성이 상대적으로 낮습니다. 따라서 Shell 자체가 해당 작업을 완료할 수 있다면 Shell 자체에서 제공하는 기능을 우선적으로 수행하는 것이 좋습니다. 하지만 부동 소수점 연산 등 Shell 자체가 완료할 수 없는 기능이 있으므로 외부 명령의 도움이 필요합니다. 또한 셸 스크립트의 이식성을 고려하여 성능이 중요하지 않은 경우 특정 셸 관련 구문을 사용하지 마세요.
허락하다,
특급,
기원전모듈로를 찾는 데 사용할 수 있으며 연산자는 모두
%,그리고
허락하다그리고
기원전지수를 찾는 데 사용할 수 있습니다. 전자는 다릅니다.
**, 후자는
^. 예를 들어:
$ expr 5 % 21$ let i=5%2$ echo $i1$ echo 5 % 2 bc1$ ((i=5%2))$ echo $i1
$ let i=5**2$ echo $i25$ ((i=5**2))$ echo $i25$ echo 5^2 |
염기 변환도 비교적 일반적인 작업입니다.
세게 때리다기본 지원
기원전예를 들어 8진수 11을 10진수로 변환하려면 다음을 수행하면 됩니다.
$ 에코 obase=10;ibase=8;11 | bc -l9$ 에코 $((8#11))9
위의 모든 내용은 특정 기본 시스템의 숫자를 기본 10으로 변환합니다. 기본 시스템 간에 변환하려면 여전히
기원전직접 사용할 수 있어 더욱 유연함
아이베이스그리고
비만기본 소스와 기본 변환 대상을 각각 지정합니다.
특정 염기로 일부 문자열을 표현하려면 다음을 사용할 수 있습니다.
od기본 구분 기호와 같은 명령
IFS공백을 포함하여,
꼬리표줄 바꿈뿐만 아니라 다음을 사용할 수 있습니다.
남자 아스키증거.
$ 에코 -n $IFS | od -c0000000 t n0000003$ 에코 -n $IFS od -b0000000 040 011 0120000003
허락하다그리고
특급부동 소수점 연산을 수행할 수는 없지만
기원전그리고
앗할 수 있다.
$ 에코 스케일=3; 1/13 | bc.076$ 에코 1 13 awk '{printf(%0.3fn,$1/$2)}'0.077
설명하다:
기원전부동 소수점 연산을 수행할 때 정밀도를 지정해야 합니다. 그렇지 않으면 기본값은 0입니다. 즉, 부동 소수점 연산을 수행할 때 기본 결과는 정수만 유지합니다. 그리고
앗소수점 이하 자릿수를 제어할 때 매우 유연합니다.
printf형식 제어가 가능합니다.
보충: 사용 중
기원전작업을 수행할 때 사용하지 않는 경우
규모동안 정밀도를 지정하십시오.
기원전뒤에 추가
-엘옵션으로 부동소수점 연산도 가능하지만 이때 기본 정밀도는 20자리입니다. 예를 들어:
$ 에코 1/13100 | bc -l.00007633587786259541
사용
기원전 -l계산은 높은 정확도를 달성할 수 있습니다.
$ 내보내기 cos=0.996293; 에코 스케일=100; a(sqrt(1-$cos^2)/$cos)*180/(a(1)*4) | -l4.9349547554113836327198340369318406051597063986552438753727649177325495504159766011527078286004072131
물론 활용도 가능해요
앗계산하려면:
$ echo 0.996293 | awk '{ printf(%sn, atan2(sqrt(1-$1^2),$1)*180/3.1415926535);}'4.93495
여기에서는 테스트 데이터 세트가 무작위로 생성되며 파일 이름은 다음과 같습니다.
수입.txt.
1 3 44902 5 38963 4 31124 4 47165 4 45786 6 53997 3 50898 6 30299 4 619510 5 5145
참고: 위 데이터의 세 열은 가족 수, 가족 규모, 월 총 가족 소득입니다.
분석: 월평균 소득이 가장 높은 가족을 찾기 위해서는 다음 두 열을 나누어서, 즉 각 가족의 월평균 소득을 구한 후, 월평균 소득에 따라 정렬하여 소득이 가장 높은 가족을 찾아야 한다. 소득이 가장 높습니다.
성취하다:
#!/bin/bash# gettopfamily.sh[ $# -lt 1 ] && echo 소득 파일을 입력하세요 && 종료 -1[ ! -f $1 ] && echo $1은 파일이 아닙니다 && 종료 -1income=$1awk '{ printf(%d %0.2fn, $1, $3/$2);}' $income sort -k 2 -n -r |
설명하다:
[ $# -lt 1 ]: 하나 이상의 매개변수를 입력해야 합니다.
$#셸에 전달된 매개변수의 수입니다.
[ ! -f $1 ]: 입력 매개변수가 파일이어야 합니다.
-에프사용법은 다음을 참조하세요.
시험주문하다,
남자 테스트
수입=$1: 소득변수에 입력변수를 할당한 후 다음과 같이 사용한다.
앗매개변수, 즉 처리할 파일
앗: 파일의 세 번째 열을 두 번째 열로 나누어 월평균 소득을 구합니다. 정확도를 고려하여 두 자리 정밀도가 유지됩니다.
정렬 -k 2 -n -r: 결과는 다음과 같습니다
앗결과의 두 번째 열
-k 2즉, 평균 월 소득이 숫자별로 정렬됩니다.
-N, 내림차순으로 정렬
-아르 자형.
데모:
$ ./gettopfamily.sh 소득.txt7 1696.339 1548.751 1496.674 1179.005 1144.5010 1029.006 899.832 779.203 778.008 504.83
보충: 이전
수입.txt데이터는 무작위로 생성됩니다. 일부 실험을 수행할 때 일부 데이터를 무작위로 생성해야 하는 경우가 종종 있습니다. 이에 대해서는 다음 섹션에서 자세히 소개하겠습니다. 여기에 생성됩니다
수입.txt데이터 스크립트:
#!/bin/bash# genrandomdata.shfor i in $(seq 1 10)do echo $i $(($RANDOM/8192+3)) $((RANDOM/10+3000))done
참고: 위 스크립트에서도 사용됨
순서이 명령은 1부터 10까지의 숫자 열을 생성합니다. 이 명령의 자세한 사용법은 이 문서의 마지막 섹션에서 자세히 소개됩니다.
환경 변수
무작위의0에서 32767까지의 난수를 생성하는 반면
앗~의
랜드()이 함수는 0과 1 사이의 난수를 생성할 수 있습니다.
$ 에코 $RANDOM81$ 에코 | awk '{srand() printf(%f, rand());}'0.237788
설명하다:
샌드()매개변수가 없으면 현재 시간이 사용됩니다.
랜드()난수 생성기
씨앗.
통과할 수 있다
무작위의변수의 척도합
앗가운데
랜드()증폭을 달성하기 위해.
$ expr $RANDOM / 128$ echo | awk '{srand() printf(%dn, rand()*255);}'
생각: 특정 IP 세그먼트에 대해 IP 주소를 무작위로 생성하려면 어떻게 해야 합니까? 예: 사용 가능한 IP 주소를 쉽게 얻습니다.
#!/bin/bash# getip.sh -- 사용 가능한 ipaddress를 자동으로 가져옵니다.# 작성자: falcon <[email protected]># 업데이트: Tue Oct 30 23:46:17 CST 2007# 자체 네트워크, 기본 게이트웨이 설정 , ping commandnet=192.168.1default_gateway=192.168.1.1over_time=2#의 시간 초과를 확인하세요. current ipaddressping -c 1 $default_gateway -W $over_time[ $? -eq 0 ] && 현재 ipaddress를 확인하세요! && exit -1;while do # 현재 구성을 삭제합니다. ifconfig eth0 down # IP 주소를 구성합니다. eth0 ifconfig eth0 $net.$(($RANDOM /130 +2)) up # 기본 게이트웨이 경로 구성 add default gw $default_gateway # 확인 새로운 구성 ping -c 1 $default_gateway -W $over_time # 작동하면 완료 [ $ -eq 0 ] && breakdone
참고: 기본 게이트웨이 주소가
192.168.1.1, 직접 구성해 주세요
default_gateway(사용 가능
경로-n보기 명령)을 사용하기 때문에
ifconfig주소를 구성할 때 이를 게이트웨이 주소로 구성할 수 없습니다. 그렇지 않으면 IP 주소가 게이트웨이와 동일해 전체 네트워크가 제대로 작동하지 않게 됩니다.
실제로 루프를 통해 일련의 숫자가 생성될 수 있지만 관련 도구가 있다면 사용해 보는 것은 어떨까요!
순서일련의 숫자를 생성할 수 있는 작은 도구입니다. 숫자의 증가 간격을 지정하거나 인접한 두 숫자 사이의 구분 기호를 지정할 수 있습니다.
$ seq 512345$ seq 1 512345$ seq 1 2 5135$ seq -s: 1 2 51:3:5$ seq 1 2 14135791113$ seq -w 1 2 1401030507091113$ seq -s: -w 1 2 1401:03:05:07:09:11:13$ seq -f 0x%g 1 50x10x20x30x40x5
보다 일반적인 사용
순서예를 들어 특정 형식으로 일부 링크를 구성한 다음
wget다음을 다운로드하세요:
$ for i in`seq -fhttp://thns.tsinghua.edu.cn/thnsebooks/ebook73/%02g.pdf 1 21`;do wget -c $i;
또는
$ for i in`seq -w 1 21`;do wget -c http://thns.tsinghua.edu.cn/thnsebooks/ebook73/$i;
보충: 에
세게 때리다버전 3 이상
~을 위한회보
~에뒤에는 바로 지나갈 수 있어요
{1..5}1에서 5까지의 숫자를 보다 간결하게 생성합니다(1과 5 사이에는 점이 두 개만 있음). 예:
$ for i in {1..5}; do echo -n $i 완료1 2 3 4 5
먼저 단어의 정의를 살펴보겠습니다. 즉, 문자로 구성된 단일 또는 다중 문자 시리즈입니다.
먼저, 각 단어의 발생 횟수를 셉니다.
$ wget -c http://tinylab.org$ cat index.html | sed -es/[^a-zA-Z]/n/g | grep -v ^$ |
그런 다음 가장 자주 발생하는 상위 10개 단어를 계산합니다.
$ wget -c http://tinylab.org$ cat index.html | sed -es/[^a-zA-Z]/n/g | grep -v ^$ | -k 1 -r | 헤드 -10 524 a 238 태그 205 href 201 클래스 193 http 189 org 175tinylab 174 www 146 div 128개 타이틀
설명하다:
고양이 index.html: index.html 파일의 내용을 출력합니다.
sed -es/[^a-zA-Z]/n/g: 알파벳이 아닌 문자를 공백으로 바꾸고 알파벳 문자만 유지합니다.
grep -v ^$: 빈 줄 제거
종류: 종류
유니크 -c: 같은 줄의 개수, 즉 각 단어의 개수를 센다.
정렬 -n -k 1 -r: 첫 번째 열에 따르면
-k 1숫자
-N역순
-아르 자형종류
머리 -10: 처음 10줄을 지웁니다.
두 가지 접근 방식을 고려할 수 있습니다.
계산해야 하는 단어만 계산하세요.
위의 알고리즘을 사용하여 모든 단어의 개수를 계산한 다음, 계산해야 하는 단어를 사용자에게 반환합니다.
그러나 두 방법 모두 다음 구조를 통해 구현될 수 있습니다. 먼저 방법 1을 살펴보겠습니다.
#!/bin/bash# statistic_words.shif [ $# -lt 1 ]; then echo 사용법: basename $0 FILE WORDS .... $(의 n에 대해 -1fiFILE=$1((WORDS_NUM=$#-1)) seq $WORDS_NUM)do Shift cat $FILE sed -es/[^a-zA-Z]/n/g | ^$ | grep ^$1$ |
설명하다:
if 조건 부분: 최소 두 개의 매개변수가 필요합니다(첫 번째 단어 파일). 후속 매개변수는 계산할 단어입니다.
파일=$1: 스크립트 다음의 첫 번째 문자열인 파일 이름을 가져옵니다.
((WORDS_NUM=$#-1)): 단어 개수, 즉 전체 매개변수 개수를 구합니다.
$#파일 이름 매개변수 빼기 (1)
for 루프 부분: 먼저 합격하세요
순서계산해야 할 단어 번호 시리즈를 생성하고,
옮기다Shell 내장 변수입니다.
교대를 도와주세요도움말 보기) 사용자가 명령줄에서 전달한 매개변수를 순서대로 뒤로 이동하고 현재 매개변수를 첫 번째 매개변수로 사용합니다.
$1, 이렇게 통과했어요
$1사용자가 입력한 모든 단어를 순회할 수 있습니다(자세히 생각해보면 배열 첨자처럼 보입니다). 당신은 고려할 수 있습니다
옮기다다음 문장을 다음으로 바꾸세요.
$1 에코시험
옮기다용법
데모:
$ chmod +x statistic_words.sh$ ./statistic_words.sh index.html Tinylab 리눅스 파이썬 175 Tinylab 43 리눅스 3 파이썬
두 번째 방법을 살펴보겠습니다. 수정만 하면 됩니다.
옮기다다음 문장이면 충분합니다.
#!/bin/bash# statistic_words.shif [ $# -lt 1 ]; echo 오류: 최소한 2 단어를 입력해야 합니다. echo 사용법: basename $0 FILE WORDS .... 종료 -1fiFILE=$1((WORDS_NUM= $#-1))for n in $(seq $WORDS_NUM)do Shift cat $FILE | -es/[^a-zA-Z]/n/g | grep -v ^$ | grep $1$done
데모:
$ ./statistic_words.sh index.html Tinylab 리눅스 파이썬 175 Tinylab 43 리눅스 3 파이썬
설명: 당연히 첫 번째 방법은 계산해야 할 단어를 미리 찾아서 계산하는 반면, 후자는 그렇지 않기 때문에 훨씬 더 효율적입니다. 실제로 사용해보면
grep~의
-이자형옵션을 사용하면 루프를 도입할 필요가 없지만 다음 명령 하나로 수행할 수 있습니다.
$ cat index.html | sed -es/[^a-zA-Z]/n/g | grep -v ^$ | grep -E ^tinylab$|^linux$ |
또는
$ cat index.html | sed -es/[^a-zA-Z]/n/g | grep -v ^$ | egrep ^tinylab$|^linux$ |
설명: 주의할 점
sed명령은 전달하지 않고 직접 파일을 처리할 수 있습니다.
고양이그러면 명령 출력이 파이프라인을 통해 전달되므로 불필요한 파이프라인 작업을 줄일 수 있으므로 위 명령을 다음과 같이 단순화할 수 있습니다.
$ sed -es/[^a-zA-Z]/n/g index.html | grep -v ^$ | egrep ^tinylab$|^linux$ |
따라서 이러한 명령이 있음을 알 수 있습니다.
sed,
grep,
유니크,
종류얼마나 유용한가. 그 자체로는 간단한 기능만 수행하지만 특정 조합을 통해 다양한 기능을 수행할 수 있습니다. 그런데 단어 수를 세는 데 매우 유용한 명령도 있습니다.
화장실 -w, 필요할 때 사용할 수도 있습니다.
보충: Advanced Bash-Scripting Guide 책에도 언급되어 있습니다.
조금명령과
요인명령은 머신에서 사용할 수 없으므로 테스트가 없습니다.
요인명령은 특정 숫자의 모든 소수를 생성할 수 있습니다. 좋다:
$ 인자 100100: 2 2 5 5
이 시점에서 Shell 프로그래밍 예제의 수치 계산이 종료됩니다. 이 글에서는 주로 다음을 소개합니다.
Shell 프로그래밍의 정수 연산, 부동 소수점 연산, 난수 생성 및 시퀀스 생성
Shell의 내장 명령과 외부 명령의 차이점과 해당 유형 및 도움말을 보는 방법
쉘 스크립트를 실행하는 여러 가지 방법
일반적으로 사용되는 몇 가지 셸 외부 명령:
sed,
앗,
grep,
유니크,
종류기다리다
예: 숫자 증가, 평균 월 소득 찾기, 자동으로 얻기
IP주소, 단어 수를 세어보세요.
기타: 명령 목록, 조건 테스트 등과 같은 관련 사용법은 위의 예에서 다루었으므로 주의 깊게 읽어 보십시오.
시간이 되시면 검토해 보시기 바랍니다.
고급 Bash 스크립팅 가이드
쉘 13 질문
쉘 기본 사항에 관한 12개 기사
SED 매뉴얼
AWK 사용자 매뉴얼
여러 Shell 토론 포럼
LinuxSir.org
ChinaUnix.net
글을 다 쓰는데 3시간 넘게 걸렸습니다. 지금은 기숙사로 돌아가서 잠자리에 들 시간입니다. 오타를 수정하고 내일 내용을 추가하겠습니다. 안녕히 주무세요!
10월 31일 일부 문구 수정, 월평균 가구소득 계산 예시 추가, 요약 및 참고자료 추가, 코드 모두 첨부하였습니다.
쉘 프로그래밍은 다음을 생각해 보면 매우 흥미로운 것입니다. 월 평균 가계 소득을 계산하는 위의 예를 사용하고
M$ 엑셀이 작업을 비교해 보면 전자가 너무 간단하고 번거롭지 않으며 사용하기 쉬운 느낌을 준다는 것을 알 수 있습니다.