1、Shell介绍,曾树洪,什么是shell,一种程序,shell,1 执行程序 2 变量和文件名替换 3 I/O 重定向 比较:wc l clz 和 wc l clz 4 管道线连接 who |wc -l 5 环境控制 6解释性程序设计语言,命令文件,创建文件 $ vi nuwho |wc l $ chmod +x nu 执行文件 $ nu,注释,#后直到行尾都是注释,变量,变量名:以字母或下划线开始,后跟0或若干个字母、数字或下划线字符。 赋值 variable=value 当向shell变量赋值时,不管值是什么,shell都把它处理为字符串. 显示变量的值 echo $variable $
2、command =wc $ option =-l $ file=zsh $ $comand $option $file shell将其转换成wc l zsh,环境变量,echo $HOME echo $PATH echo $0 set a b c echo $# echo $,$变量和临时文件,$当前进程的ID号 $ grep v “google” express /tmp/express $ mv /tmp/express express$ grep v “google” express /tmp/express$ $ mv /tmp/express$ express,局部变量,$ cat
3、vartest echo:$x: $ x=100 $ ./vartest 问现在显示多少?$ cat vartest2 X=50 echo :$x: $ x=100 $ ./vartest2 问现在显示多少?,导出变量,$ cat vartest3echo x = $xecho y =$y $ X=100 $ Y=10 $ ./vartest3 ? $ Export y $ ./vartest3 ?注:这里的3,4,5是有前后关系的,彼此影响的。,$ cat vartest4x=50y=5z=1export zvartest5 $cat vartest5echo x = $xecho y =$
4、yecho z = $z $ ./ vartest4 ?,export -p,列出所有变量的清单,(.) 和.;,()是对一串命令重新开一个子shell进行执行 对一串命令在当前shell执行 ()和都是把一串的命令放在括号里面,并且命令之间用;号隔开 ()最后一个命令可以不用分号 最后一个命令要用分号,(.) 和.;,的第一个命令和左括号之间必须要有一个空格 ()里的各命令不必和括号有空格 ()和中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令,(.) 和.;,$ x=50 $ (x=100) $ echo $x ? $ x=100; $ echo $x ?
5、,给子shell传递变量的另一方法,$ cat foo1 echo :$x: foo2 $ cat foo2 echo :$x: $ foo1 ?,$ x=100 foo1 ? $ echo :$x:,空值,如果一个变量没有值,就说它含有空值.当shell 进行变量值替换时,空值被从命令行中清楚掉. $Echo :$nozsh: 假设nozsh没有赋值.: $ wc $nozsh l $nozsh zsh shell将其转换成wc l zsh,文件名替换和变量,shell在给变量赋值时不进行文件名替换 shell先做变量替换,再做文件名替换 $ x=* 把字符*存入变量X中,而不是把当前目录中
6、的所有文件名存入变量x中. $ echo $x,$filename=zsh zsh为当前目录下的一文件名 比较 $ mv $filename $filenameX $ mv $filename $filenameX $ mv $filename “$filename”X,内部的整数算术运算,$(expression) expression由变量和运算符构成。 $ echo $ (i+1) i 前面不用$符号。 i=$(i*5),read,read variables从标准输入读入一行数据,并把所读入的第一个词赋给variables中列出的第一个变量,第二个赋给第二个变量。 $ read x y
7、,习题,编写一个名为nf的程序,显示当前目录中的文件数。键入程序并测试。 编写一个名为whos的程序,显示排好序的已登录用户清单。只显示用户名,不要有其他信息。键入程序并测试。,引用,单引号,示例: 在express查找:google $grep google express 在express查找:google is $grep google is express 思考:shell传了几个参数给grep? $grep google is express 思考: shell传了几个参数给grep?,单引号,shell会忽略掉单引号内的所有特殊字符的原来作用。,思考,text =* means a
8、ll files in zhe directory $ echo $text$ echo “$text”,双引号,双引号中,除了下面的三种字保留本意外,其他的被shell忽略: 1:$ 2:反引号 3:反斜杠,反斜杠,作用1: 等价与在一个字符前后加上单引号 比较:echo 和 echo x=* 比较:echo $x 和 echo $x 思考 :echo 的作用?,反斜杠,作用2: 当用于一行的最后一个字符时,表示换行。 $ lines=one two 比较:$ echo “$lines” ,echo $lines, echo lines,练习,在终端上显示 displays the valu
9、e of x,which is $x 显示的时候,第2个$x的值应该被替换,比如如果x=3,显示: displays the value of x,which is 3,反引号,Shell 执行反引号中命令,并把该命令的标准输出插在命令所在的位置。 echo your current working directory is pwd,$()结构,功能与反引号差不多。 优点:1复杂的命令组合比反引号更容易看懂2 容易实现嵌套,实例,$ cat nu echo there are $(who | wc l )users logged in $ now=$(date) $ echo $now$ fi
10、lelist=$(ls) $ echo $filelist 比较:echo “$filelist”,echo $filelist $ namelist =$(cat names) $ echo “$namelist”,实例,filename=/home/zsh/express filename=$(echo $filename | tr “$(echo $filename | cut cl)” “”) echo $filename,参数传递,$#,命令行中所键入的参数个数 $ cat args echo $# arguments passed echo arg 1=:$1,arg 2=:$2,
11、arg 3= :$3 $ args a b c3 arguments passedarg 1=:a, arg 2=:b,arg 3= :c $ arg x*,$*,传递给程序的所有参数 $ cat arg2 echo $# arguments passed echo they are:$*: $ arg2 a b c 3 arguments passedthey are: a: b: c,$n,$1,$9 ,$10,$11,shift,把位置参数左移 shift n 把位置参数左移n位cat _shift #!/bin/shwhile “$1“ != “ ; doecho “$1“shift
12、doneexit 0,练习,1 编写一个名为rename的程序,给第1个参数所给定的文件更名,在原名后添加第2个参数包含的一串字符。即rename memol .sv应该将文件memol更名为memol.sv 2编写一个名为unrename的程序,从第1个参数指定的文件名的后部去掉第2个参数包含的字符串,即unrename memol.sv .sv应该把文件memol.sv更名为memol。要保证从尾部去掉字 符串,如unrename test1test test应该将tes1test更名为test1(提示:用sed和命令替换),函数,name () command;command; 函数只在定义它的shell中有效,不能被传递到子shell. $ nu () who | wc l; $ nu,