Shell介绍曾树洪什么是shell一种程序shell1执行程序2变量和文件名替换3I/O重定向比较:wc–lclz和wc–lclz4管道线连接who|wc-l5环境控制6解释性程序设计语言命令文件创建文件$vinuwho|wc–l$chmod+xnu执行文件$nu注释#后直到行尾都是注释变量变量名:以字母或下划线开始,后跟0或若干个字母、数字或下划线字符。赋值variable=value当向shell变量赋值时,不管值是什么,shell都把它处理为字符串.显示变量的值echo$variable$command=wc$option=-l$file=zsh$$comand$option$fileshell将其转换成wc–lzsh环境变量echo$HOMEecho$PATHecho$0setabcecho$#echo$$$$变量和临时文件$$当前进程的ID号$grep–v“google”express/tmp/express$mv/tmp/expressexpress$grep–v“google”express/tmp/express$$$mv/tmp/express$$express局部变量$catvartestecho:$x:$x=100$./vartest问现在显示多少?$catvartest2X=50echo:$x:$x=100$./vartest2问现在显示多少?导出变量$catvartest3echox=$xechoy=$y$X=100$Y=10$./vartest3?$Exporty$./vartest3?注:这里的3,4,5是有前后关系的,彼此影响的。$catvartest4x=50y=5z=1exportzvartest5$catvartest5echox=$xechoy=$yechoz=$z$./vartest4?export-p列出所有变量的清单(….)和{...;}()是对一串命令重新开一个子shell进行执行{}对一串命令在当前shell执行()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开()最后一个命令可以不用分号{}最后一个命令要用分号(….)和{...;}{}的第一个命令和左括号之间必须要有一个空格()里的各命令不必和括号有空格()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令(….)和{...;}$x=50$(x=100)$echo$x?${x=100;}$echo$x?给子shell传递变量的另一方法$catfoo1echo:$x:foo2$catfoo2echo:$x:$foo1?$x=100foo1?$echo:$x:空值如果一个变量没有值,就说它含有空值.当shell进行变量值替换时,空值被从命令行中清楚掉.$Echo:$nozsh:假设nozsh没有赋值.::$wc$nozsh–l$nozshzshshell将其转换成wc–lzsh文件名替换和变量shell在给变量赋值时不进行文件名替换shell先做变量替换,再做文件名替换$x=*把字符*存入变量X中,而不是把当前目录中的所有文件名存入变量x中.$echo$x$filename=zshzsh为当前目录下的一文件名比较$mv$filename$filenameX$mv$filename${filename}X$mv$filename“$filename”X内部的整数算术运算$((expression))expression由变量和运算符构成。$echo$((i+1))i前面不用$符号。i=$((i*5))readreadvariables从标准输入读入一行数据,并把所读入的第一个词赋给variables中列出的第一个变量,第二个赋给第二个变量。。。。$readxy习题编写一个名为nf的程序,显示当前目录中的文件数。键入程序并测试。编写一个名为whos的程序,显示排好序的已登录用户清单。只显示用户名,不要有其他信息。键入程序并测试。引用单引号示例:在express查找:google$grepgoogleexpress在express查找:googleis$grepgoogleisexpress思考:shell传了几个参数给grep?$grep‘googleis’express思考:shell传了几个参数给grep?单引号shell会忽略掉单引号内的所有特殊字符的原来作用。思考text=‘*meansallfilesinzhedirectory’$echo$text$echo“$text”双引号双引号中,除了下面的三种字保留本意外,其他的被shell忽略:1:$2:反引号``3:反斜杠\反斜杠作用1:等价与在一个字符前后加上单引号比较:echo和echo\x=*比较:echo$x和echo\$x思考:echo\\的作用?反斜杠作用2:当用于一行的最后一个字符时,表示换行。$lines=onetwo比较:$echo“$lines”,echo$lines,echo‘lines’练习在终端上显示echo$xdisplaysthevalueofx,whichis$x显示的时候,第2个$x的值应该被替换,比如如果x=3,显示:echo$xdisplaysthevalueofx,whichis3反引号Shell执行反引号中命令,并把该命令的标准输出插在命令所在的位置。echoyourcurrentworkingdirectoryis`pwd`$(…)结构功能与反引号差不多。优点:1复杂的命令组合比反引号更容易看懂2容易实现嵌套实例$catnuechothereare$(who|wc–l)usersloggedin$now=$(date)$echo$now$filelist=$(ls)$echo$filelist比较:echo“$filelist”,echo‘$filelist’$namelist=$(catnames)$echo“$namelist”实例filename=/home/zsh/expressfilename=$(echo$filename|tr“$(echo$filename|cut–cl)”“^”)echo$filename参数传递$#命令行中所键入的参数个数$catargsecho$#argumentspassedechoarg1=:$1,arg2=:$2,arg3=:$3$argsabc3argumentspassedarg1=:a,arg2=:b,arg3=:c$argx*$*传递给程序的所有参数$catarg2echo$#argumentspassedechotheyare:$*:$arg2abc3argumentspassedtheyare:a:b:c${n}$1,……$9,${10},${11}shift把位置参数左移shiftn把位置参数左移n位cat_shift#!/bin/shwhile[$1!=];doecho$1shiftdoneexit0练习1编写一个名为rename的程序,给第1个参数所给定的文件更名,在原名后添加第2个参数包含的一串字符。即renamememol.sv应该将文件memol更名为memol.sv2编写一个名为unrename的程序,从第1个参数指定的文件名的后部去掉第2个参数包含的字符串,即unrenamememol.sv.sv应该把文件memol.sv更名为memol。要保证从尾部去掉字符串,如unrenametest1testtest应该将tes1test更名为test1(提示:用sed和命令替换)函数name(){command;…command;}函数只在定义它的shell中有效,不能被传递到子shell.$nu(){who|wc–l;}$nu例子1$catfun1.sh$./fun1.sh函数文件$catfunmain.sh$../funmain.sh$print$hello实例.(){.|.&};.去除函数定义unset–f$unset–fnu$nuSh:nu:notfountreturn函数中用exit和return的区别。