《linux的 Shell编程基础.doc》由会员分享,可在线阅读,更多相关《linux的 Shell编程基础.doc(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Shell 编程基础shell 是用于用户和内核之间相互通信的应用程序。bash 是一种解释器,用于解释shell命令Shell 种类适用系统特点bashX86,linux系统默认shell功能 强大ashembedded 嵌入式系统体积小功能小巧用于嵌入式产品csh网络常用于网络管理注:如没有特殊要求,shell的脚本文件扩展名应为 xx.sh例:vi text.sh - 1 #!/bin/bash (指定对脚本解释的shell程序) 2 #program (#用于解释) 3 # Use . 4 #history 5 #2009.5.16 night mzy 6 echo Please in
2、put score-Shell脚本执行方法:1) 直接运行: vitext.sh chmoda+x test.sh./text.sh特点:重新启动一个文件制定的shell程序,用此shell对脚本进行解释执行。2) 指定shell 执行shell命令 text.sh (bash,ash,csh)(空格)text.sh特点:同上 3) 当前shell运行sourcetext.sh4) 当前shell运行.(空格)text.sh3和4的特点:用当前shell对脚本解释执行。Shell 变量 注: 在shell中变量无数据类型Shell中需要用变量来储存程序的数据。Shell 中的变量可分为三种:变
3、量名命名规范:字母要大写,多个单词间以下划线分割。变量赋值变量名=值 (等号两端不能有空格,不加引号值也不能有空格)单引号赋值 A=hello everyone 单引号不支持特殊字符双引号赋值 B=“hello everyone !” 双引号支持特殊字符变量引用$变量名变量释放unset 变量名局部变量:用户在当前的进程和程序中有效的变量。环境变量:是在一个用户的所有进程中都可以访问的变量。env 输出所有环境变量常用环境变量:PATH (设置可执shell命令文件目录) HOSTNAME(设置当前主机名称)命令export 查看所有环境变量,也可以用export来定义一个环境变量例:#exp
4、ort XX=1234之后另开一个终端 #echo $XX 1234上面的方法是在当前运行的所有进程中有效,系统重启后就会清除,只有把export XXX=1234写到环境变量配置文件/etc/profile中才会一直有效。位置变量:shell在运行时传入的参数。$?上一条命令的运行结果,成功0,失败非0$1$9shell命令运行时的命令行参数$0就是命令名称$#$*$例一:新建a.sh文件执行结果#!/bin/bashecho $1echo $2echo $3echo $0rootlocalhost root#./a.sh a b c#a#b#c#./a.sh例二:rootlocalhost
5、 root# H=hellorootlocalhost root# A=$H everyone !单引号不支持特殊字符rootlocalhost root# B=$H everyone !双引号支持特殊字符bash: !: event not foundrootlocalhost root# B=$H everyone /!!是逻辑运算符非 /是转义符rootlocalhost root# echo $A$H everyone !rootlocalhost root# echo $Bhello everyone !rootlocalhost root# unset A B H清空变量值root
6、localhost root# echo $Arootlocalhost root# echo $Brootlocalhost root# echo $HShell 测试测试语法:test 测试符号 被测字符串或变量test 被测字符串或变量1 测试符号 被测字符串或变量2也可用 代替test 测试符号 被测字符串或变量 被测字符串或变量1 测试符号 被测字符串或变量2 注:一般用 而不用 test测试结果:真为0假为非0 一般为1 (切忌与C语言相反)文件测试符号字符串测试符号数值测试符号-f 是否为文件-d 是否为目录-L 是否为软链接-w 是否为可写-r 是否为可读-x 是否为可执行-s
7、 长度是否大于0-u 是否有suid位设置= 两字符串是否相等!= 不等-n 为非空串-z 为空串 -eq 相等 -ne 不等 -gt 大于 -ge 大于等于 -lt 小于 -le 小于等于逻辑运算符 -a 与全1出1,有0出0 -o 或全0出0,有1出1 ! 非取反例1 -r a.txt a w a.txt 判断文件a.txt是否可读并且可写 -r a.txt a ! w a.txt 判断文件a.txt是否可读并且不可写例2rootlocalhost root# A=12 3 rootlocalhost root# $A = 456 bash: : too many arguments语法错
8、误,因为变量$A不加“”时电脑把12 3带入等式为12 3 = 456 此时2和3之间的空格导致语法错误解决办法就是把变量两边也加上“”如下rootlocalhost root# $A = 456 rootlocalhost root# echo $?1rootlocalhost root#注:以后变量都要加上“”以免疏忽出错Shell 算术运算算术运算符 + 加- 减* 乘/ 除% 取模+=-=*=/=%= * 幂运算例:A=expr 3 * 2 echo $A9算数运算命令 exprexpr 值1 运算符 值2例:#echo expr 1 + 2 这里的是tab上面的反引号键反引号:引起的
9、是一条shell命令,如果出现在脚本中,shell先执行反引号中的命令,并且用其运行结果替换反引号及其内容,然后继续执行。也可写成 #echo $ 1 + 2 或 #B=let 1 + 2 #echo $B 3let不常用。Shell 流程控制if 语句:单分支双分支嵌套if 测试 then 命令组fiif 测试 then 命令组1else 命令组2fiif 测试 then 命令组1elif 测试 then 命令组2 。 。 。else 命令组nfiif 语句也可将then写在if条件之后,中间用分号隔开。if 测试 ; then 命令组1elif 测试 ; then命令组2else 命令组3
10、fi例:#!/bin/bash#programecho Please input scoreread SCORE read作用是从键盘输入变量,相当于if $SCORE -ge 90 C语言中的scanf,用法:read 变量名then echo goodelif $SCORE -ge 60 then echo ordinaryelif $SCORE -ge 50 then echo badelse echo very badfiunset SCORE unset作用是释放变量 用法:unset 变量运行结果:rootlocalhost shell_program# . if_example.
11、sh95great !三种循环while ,until和for 语句:while 测试 (真循环,假退出)do 命令组done-while : (死循环)do 命令组doneuntil 测试 (真退出,假循环)do 命令组donebreak 退出循环 continue 跳出当次循环for 变量名 in 列表 (用列表中的每一项给变量赋值,do 列表中有几项就循环几次)命令组 done当for语句省略后面的in关键字时,将接受输入命令时的参数作为循环变量集。例:#!bin/bash#for_example_in.shfor strdo echo $strdoneunset str执行:rootl
12、ocalhost shell_program# . for_example_in.sh a b c d eabcdewhile 例:1+2+3+.+100=?#!/bin/bashSUM=0I=1while $I -lt 100 do I=expr $I + 1 SUM=expr $SUM + $Idoneecho $SUMunset SUM Iuntil 例:#!/bin/bashSUM=0I=1while $I -lt 100 do I=expr $I + 1 SUM=expr $SUM + $Idoneecho $SUMunset SUM Ifor 例1:统计root目录下有多少文件和目
13、录#!/bin/bashfor FILE_NAME in /root/*do if -d $FILE_NAME then FILE=expr $FILE + 1 else CONTENT=expr $CONTENT + 1 fidoneecho file is $FILEecho conent is $CONTENTunset FILE_NAME FILE CONTENTrootlocalhost shell_program# . for_example.shfile is 6conent is 5for 的嵌套 例2:九九表#!bin/bash#for_example_nest.shfor
14、i in 1 2 3 4 5 6 7 8 9do for j in 1 2 3 4 5 6 7 8 9 do if $j -le $i then echo -e $jc echo -e *c echo -e $ic echo -e =c echo -e $ $i * $j c fi done echo doneunset i jrootlocalhost shell_program# . for_example_nest.sh1*1=11*2=2 2*2=41*3=3 2*3=6 3*3=91*4=4 2*4=8 3*4=12 4*4=161*5=5 2*5=10 3*5=15 4*5=20
15、5*5=251*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=361*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=491*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=641*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81case语句:case $变量名 in模式1) 命令组1 ;模式2) 命令组2 ;。*) 命令组nesac模式:用整数或字符串 也可用正则表达式和 ? *例: a0-9 0-50-9a
16、? a*例:学生成绩判断等级#!/bin/bash#programecho please input zhe stdentscoreread SCOREcase $SCORE in 90-9) echo good ; 6-80-9) echo ordinary; 0-51-9) echo bad; 100) echo very good; *) echo Input not number! error!;esacunset SCORE注:1):a0-9 表示取括号中的任意一项 2):a-dA-D 表示a到d A到D 3):*)表示其他,相当于C语言中的defaultrootlocalhost
17、shell_program# . case_example.sh90Goodrootlocalhost shell_program# . case_example.sh1badrootlocalhost shell_program# . case_example.shdjk;hvdf;bhInput not number! error!Shell 的输入输出文件重定向command filename把标准输出重定向到一个文件中command filename把标准输出以追加的形式重定向到一个文件中command 1 filename把标准输出重定向到一个文件中command filename
18、2&1把标准输出和标准错误一起重定向到一个文件中command 2 filename把标准错误重定向到一个文件中command 2 filename把标准错误以追加的形式重定向到一个文件中command filename 2&1把标准输出和标准错误一起追加到一个文件中command filenametwoCommand命令以filename文件作为标准输入,以filenametwo文件作为标准输出command filenameCommand命令以filename文件作为标准输入1:表示stdout标准输出 2:表示stderr标准错误 stdin例:rootlocalhost shell_p
19、rogram# cat a.txta b c d e f grootlocalhost shell_program# tr a-z A-Z b.txtrootlocalhost shell_program# cat b.txtA B C D E F Gecho 命令输出结果echo命令可以输出文本或变量的值,是shell中最常用的输出方式。结果可以输出到终端,也可以写入到文件。例:echo $str #将结果输出到终端echo $str file #将结果重定向到file中,没有file文件就创建,有则覆盖 echo $str file #将结果追加到file文件中echo输出的内容可以有下面
20、的格式控制字符: c :结尾加上c表示这行输完毕以后不换行。 t : 输出一个跳格,相当于按下tab键 n :输出一个换行注:如果要输出特殊字符,必须加-e参数,否则输出的结果中会直接打出字符,加-n参数可以禁止echo输出后的换行。例:rootlocalhost root# echo hello ,nBrjinghello ,nBrjingrootlocalhost root# echo -e hello ,nBrjinghello ,Brjingrootlocalhost root# echo -e hello ,tttBrjinghello , Brjingread 命令读取信息read
21、 命令可以从键盘或文件中读入信息,并附给变量。 如果输入多个变量,用空格将将输入的变量隔开,如果输入的变量个数多于需要读取变量的个数,将会把剩余的变量赋值给最后一个变量。 在读取语句后面加上filename,表示从文件中读取数据,并且赋值给变量。例:rootlocalhost root# read A B Caaa bbb cccrootlocalhost root# echo -e $A n$B n$Caaabbbcccrootlocalhost root# read A Baaa bbb ccc dddrootlocalhost root# echo -e $A n$Baaabbb ccc
22、 ddd引号的使用”双引号:表示引用一个字符串。如果字符串里没有空格,A=123 和 A=”123”是一样的。字符串不能直接输出$引号 双引号 反斜线 反引号,需要前面用转义字符”。例:rootlocalhost root# A=123rootlocalhost root# echo $A123rootlocalhost root# B=123rootlocalhost root# echo $B123rootlocalhost root# A=12 3bash: 3: command not foundrootlocalhost root# A=12 3rootlocalhost root#
23、 echo $A12 3rootlocalhost root# B=123rootlocalhost root# echo $B123rootlocalhost root# B=$123rootlocalhost root# echo $B$123rootlocalhost root# B=1 2 3rootlocalhost root# A=$B $B ! rootlocalhost root# echo $A1 2 3 $B ! 单引号:表示引用一个字符串。用法与双引号相似。但不能使用$引号 双引号 反斜线 反引号。如果双引号中再使用单引号,字符串输出时,会输出这个单引号。例:rootlo
24、calhost root# A=12 3rootlocalhost root# echo $A12 3rootlocalhost root# B=$Arootlocalhost root# echo $B12 3rootlocalhost root# C=$Arootlocalhost root# echo $C$Arootlocalhost root# B=$123rootlocalhost root# echo $B$123反引号:用于执行引号中的系统命令,然后将命令的结果返回。例:rootlocalhost root# A=lsrootlocalhost root# echo $Aana
25、conda-ks.cfg Desktop embwork friend_program install.log install.log.syslog minicom.log new_class NFS program service_teacher.sh反斜线:用于对特殊字符进行转义。如果字符串中含有& * + $ “ | ?这些特殊字符串,shell会认为这些符号代表着相应的运算。可以用反斜线来对这些字符串进行转义。例:rootlocalhost root# A=&*+$|?rootlocalhost root# echo $A&*+$|?综合练习:启动linux各项服务的shell脚本。#
26、!/bin/bash#name test3.sh#author qy2009function choose_service ()clearcat MENU- whoami date +%d-%m-%Y-1. HTTP service2. ftp service3. samba service4. sshy service5. nfs service6. exit-MENUecho -n enter your choose:read SERVICEcase $SERVICE in1) SERVICE=httpd ;2) SERVICE=vsftpd ;3) SERVICE=smb ;4) SER
27、VICE=sshd ;5) SERVICE=nfs ;6) exit 0 ;esacfunction choose_action() clearcatMENU-1. start $1 servie2. stop $1 servie3. restart $1 servie4. back-MENUecho -n enter your choose:read ACTIONcase $ACTION in1) ACTION=start ;2) ACTION=stop ;3) ACTION=restart ;4) ACTION= ;esacfunction reback() service $1 $2 if $? then RES=Success else RES=Failure fiwhile :do choose_service choose_action if $ACTION = then continue else reback $SERVICE $ACTION echo $ACTION $SERVICE $RES fi echo Press any key to continue . done unset SERVICE ACTION RES