SHELL编程教案.docx
《SHELL编程教案.docx》由会员分享,可在线阅读,更多相关《SHELL编程教案.docx(26页珍藏版)》请在冰豆网上搜索。
![SHELL编程教案.docx](https://file1.bdocx.com/fileroot1/2022-10/29/b9372dd5-d9b1-4a5f-a1d7-8f4d1d3f5ced/b9372dd5-d9b1-4a5f-a1d7-8f4d1d3f5ced1.gif)
SHELL编程教案
SHELL编程
基本概念:
计算机为我们工作的是硬件,控制硬件的是计算机内核,我们使用者是利用Shell控制一些kernel提供的工具(Utility)来操控硬盘替我们正确工作。
Linux可以使用的shell:
/bin/sh(已经被/bin/bash取代)
/bin/bash(Linux预设的bash,是GNU计划中的)
/bin/ksh(Kornshell由AT&ABelllab开发的,兼容于bash)
/bin/tcsh(整合Cshell,提供更多的功能)
/bin/csh(被/bin/tcsh取代)
/bin/zsh(由ksh发展过来的,提供更多的功能)
命令补全功能:
Tab,按一次能把唯一匹配的补全,如果按两次会把所有能匹配的全部打印出来
命令取别名功能:
aliaslm='ls-al
Linux提供2种命令:
内部命令的执行速度比外部命令要快的多
shell的内部命令如:
echoshell内部本身提供的命令
shell的外部命令如:
lsshell本身不提供,但它是通过shell调用/bin/ls
在解释内部命令是shell不需要创建子进程。
而外部命令需要创建单独的新进程,从而加大了系统的开销。
外部命令就是路径搜索下可以找到的,执行会起子进程。
某些shell内部命令与系统命令具有相同的名字,但其实现方式不一样如shell内部命令echo与系统命令/bin/echo名字完全一样功能也相同如:
[root@am~]#echo"testechostring"
testechostring
[root@am~]#/bin/echo"testechostringusesystemcommand"
testechostringusesystemcommand
使用type命令,可以查看该命令是内部命令还是外部命令
-t显示意义缺省参数显示是内部还是外部
*系统命令在/bin目录下,若把/bin下的该命令文件删除后,该命令仍然好用,则为内部命令。
所有的内部命令都可以用help查看帮助说明,helpls就不可以,因为ls是外部命令。
而外部命令寻求帮助方法:
ls--help可以看一个简单的帮助
符号:
双引号""、单引号、$、反引号``、转义符\、算术运算符[]、命令结束符;、子shell激活()、逻辑运算符||&&、:
空命令、!
取反
Shell脚本shellscript
开头必须是#/bin/bash#!
后跟使用的shell的完整路径
使脚本可执行:
加上x权限
1)注释#
#echo"helloworld"
echo"helloworld"#
echo"hello#world"
echo"hello\#world"
echohello#world
Echohello\#world
2)在脚本中引用命令行传来的参数$
$0$1$2$#$*$$$@$?
$可以引用变量
hello="helloeverybody"
echo$hello
局部变量作用域被限定在当前shell中,脚本执行结束,变量不再可用。
declare可以用来定义局部变量,可以创建局部变量并为其赋值。
value=”john”
echo$value
declarename=12
echo$name
上面介绍的那些特殊变量可以理解为局部变量
全局变量称环境变量,由内置的export命令创建,当脚本结束,该全局变量超出作用域。
带-x选项的函数declare也用于设置环境变量并将其作为输出:
#!
/bin/bash
#a.sh
exportname_tmp=”jone”
echo$name_tmp
declare–xvalue_tmp1=12
declarevalue_tmp2=13
value_tmp3=14
echo$value_tmp1
echo$value_tmp2
echo$value_tmp3
./b.sh
#!
/bin/bash
#b.sh
echo$name_tmp
echo$value_tmp1
echo$value_tmp2
echo$value_tmp3
declare定义一个变量
-x-a-r-i
使用unset取消一个变量的定义
read读取用户输入的一行
readname1name2name3
echo$name1$name2$name3
向屏幕输出:
echoprintf
printf"name1is%d"$name1
let命令
用来执行整型算术运算和数值表达式测试。
i=5
leti=i+1
echo$i打印6
let"i=i+2"
echo$i打印8
let“i+=1”
echo$i打印9
i=3
((i+=4))双括号可以用来代替let命令
echo$i
条件运算
关于退出状态:
0表示成功或表达式为真;1表示失败或者表达式为假
echo#?
可输出退出状态,退出状态保存在特殊变量?
中
test和方括号
方括号和test用来测试表达式的值,字符串必须用引号括起来。
test.sh比较程序
name=Tom
grep"$name"/etc/passwd
echo$?
test$name==Tom
echo$?
[$name=Tom]方括号是test命令的另一种表示方法。
echo$?
[$name=[Tt]?
?
]test命令不允许通配符
echo$?
x=5
y=20
[$x-gt$y]$x是否大于$y返回0,否则返回1
echo$?
[$x-le$y]$x是否小于或等于$y,是返回0,否则返回1
echo$?
if命令
格式:
if命令
then
命令
fi
if条件判断使用test或[]
if_fi.sh
#!
/bin/bash
echo"areyouo.k(y/n)?
"
readanswer
If["$answer"=Y-o"$answer"=y]
then
echo"clabtohearit."
fi
if[[$answer==[Yy]*]]
then
echo"gladtohearit."
fi
bigfile.sh
#!
/bin/bash
if(($#!
=2))
then
echo"usage:
$0mdayssize"
exit1
fi
if(($1<0||$1>30))
then
echo"mdaysisoutofrange"
exit2
fi
if(($2<=20))
then
echo"sizeisoutofrange"
exit3
fi
测试:
./bigfile.sh参数出错
./bigfile.sh40080参数1满足条件,退出状态为2
$echo$?
打印为2
./bigfile.sh252参数2满足条件,退出状态为3
$echo$?
打印为3
if-else-fi
格式:
if命令
then
命令
else
命令
fi
if_else_fi.sh
#!
/bin/bash
name=userx
ifgrep"$name"/etc/passwd>/dev/null
#grep命令的退出状态为0,程序转向then语句
then
echofound$name
else
echo"can'tfind$name"
exit1
fi
if/elif/else命令
格式:
if命令
then
命令
elif命令
then
命令
elif命令
then
命令
else
命令
fi
tellme.sh功能:
<0或>120打印welcometoourplant
>0并<12打印achildisagardenofverses
>12并<19打印rebelwithoutacause
19到29打印yougettheworldbythetail
29到39打印thirtysomething
其余打印sorryiasked
#!
/bin/bash
echo-n"howoldareyou?
"
readage
if[$age-lt0-o$age-gt120]
then
echo"welcometoourplant"
exit1
fi
if[$age-ge0-a$age-le12]
then
echo"achildisagardenofverses"
elif[$age-gt12-a$age-le19]
then
echo"rebelwithoutacause"
elif[$age-gt19-a$age-le29]
then
echo"yougettheworldbythetaill"
elif[$age-gt29-a$age-le39]
then
echo"thirtysomething"
else
echo"sorryiasked"
fi
perm_chech.sh
功能:
file为目录打印isadirectory,file为普通文件则判断文件的属性。
#!
/bin/bash
echo"inputfilename:
"
readfile
if[-d$file]
then
echo"$fileisadirectory"
elif[-f$file]
then
if[-r$file-a-w$file-a-x$file]
then
echo"youhaveread,andexecutepermissionon$file"
fi
else
echo"$fileisneitherafilenoradirectory"
fi
case命令
case命令是一个多路分支命令。
格式:
case变量in
值1)
命令
;;
值2)
命令
;;
*)
命令
;;
esac
xcolors.sh
#!
/bin/bash
echo-n"chooseaforegroundcolor"
readcolor
case"$color"in
[Bb]l?
?
)#以B或b开头,后面跟字母l和两个任意字符
echo'blue'
;;
[Gg]ree*)
echo'green'
;;
red|orange)
echo'redorange'
;;
*)
echo'blank'
;;
esac
echo'outofcasecommand'
循环命令
for命令
格式:
for变量in词表
do
命令
done
forloop.sh
#!
/bin/bash
forpalintomdickharryjoe#循环变量为字符串
d