




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、什么是shell? 命令解释器俗称外壳程序 用户通过shell向kernel发送指令,kernel再向硬件发送指令 Shell版本众多,例如常听到的 Bourne Shell (sh) 、在Sun中默认的C Shell、 商业上常用的K SHell以及TCSH 等,每一种Shell都各有其特点。 Linux 使用的是Bourne Again Shell(简称 bash),这个 Shell是Bourne Shell的增强版本,是基于GNU的架构下发展出来的。内核(Kernel)外壳(Shell,KDE,Application)用户硬件(Hardware)第1页/共48页Bash shell特点
2、命令补全补全功能 如果在执行命令的时候不想按下太多的按键(例如命令pcprofiledump),在输入了 pcprofile 之后,再按下 Tab 键的话,那么 bash 马上会自动的将后面的dump接上来。 如果有重复的命令,那么按下两次 Tab 将会把所有重复的命令列出来。 直接在提示字符后面连按两次 键,则系统会将所有可以使用的命令都列出来。 例如,如果想要知道目前系统里面,所有以b开头的命令呢?就是按下 b 之后,连按两次就ok。第2页/共48页Bash shell特点 文件名称补全功能 如果用 vim 来读取某个文件,例如 /etc/man.config 这个文件,那么可以输入 vi
3、m /etc/man之后,直接按下 键,该文件名称就会被自动的补上。 同样,出现文件多个匹配项时,可以按下两个TAB键来显示所有匹配项。 这样大大增加了指令输入的正确率。第3页/共48页Bash shell特点 命令记忆能力 Linux可以记忆以前输入过的命令,只要使用上下键就可以找到以前执行的指令来执行。 这些命令按照先后顺序记录在用户Home目录下的隐藏文件.bash_history中 .bash_history里面记录了这一次登录以前执行过的命令,本次登录执行的命令都保存在内存中,只有成功注销之后,内存数据才会刷新到.bash_history文件中 有时候.bash_history文件中
4、记录了你包含在指令中的密码,可能引起安全问题,所以最好还是设置命令的记录数量不要太大。第4页/共48页Bash shell特点 命令名称: history 用法:history number 显示最近 number个命令,不指定number则选择全部。 执行历史命令: 方法1:!number 执行历史命令中编号为number的那个命令 方法2:!command 执行历史命令中最近一次以command开头的命令,命令无须打全,只要匹配前面几个字符即可。 方法3:! 执行上一条命令 第5页/共48页Bash shell特点 命令别名设置功能 假如我需要知道某个目录底下的所有文件信息(包含隐藏文件)
5、及所有的文件属性,那么我就必须要输入ls -al 这样的指令。 每次都输入多麻烦! 可以通过为自己经常使用的命令(包括参数)定义别名来避免过多输入。 例如:alias lm=ls -al (注意=两边不要有空格) 那么以后lm就等于执行ls -al 直接输入alias,可以显示目前以及定义好的所有别名第6页/共48页编译型语言和脚本编程语言 许多大中型程序是用编译型语言写的,例如:C/C+/java。这类程序只要从源代码转换成目标代码,就能直接在计算机上执行。(java类似。它是转换成字节码,在java虚拟机上执行) 编译型语言的好处是效率高,它的二进制代码可直接被cpu执行。缺点是它们直接处
6、理的是字节、整数、浮点数等机器层的对象。例如,C+很难进行“将一个目录内的所有文件复制到另一个目录”这样简单的操作。 脚本编程语言通常是解释型的语言,这类程序的执行是由解释器读入程序代码,并将其转换成内部的形式,再执行。这类语言有awk、perl、python、javascript、Ruby和shell。用脚本编程语言写的程序代码,称为脚本程序。 脚本编程语言的好处是,它多半运行在比编译器还高的层级,能轻易处理文件和目录之类的对象。缺点是:它的效率通常不如编译型语言高。它们并不能直接被cpu执行,执行时还需要进行转换。第7页/共48页SHELL脚本的优点 shell脚本常用于系统管理工作,或是
7、结合现有的程序以完成小型的、特定的工作。通过把工作用到的命令串起来,放进一个独立的脚本中,以后只要执行该程序就能完成工作了。 shell是各类unix版本的通用功能,且经过了POSIX的标准化。一个编写良好的shell脚本,可以应用到多个系统上。因此之所以使用shell脚本是基于:简单性:shell是一个高级语言;通过它可以简洁地表达复杂的操作。可移植性:使用POSIX所定义的功能,可以做到脚本无需修改就可在不同的类unix系统上运行。开发容易:可以在较短时间内完成一个功能强大又好用的脚本。第8页/共48页SHELL脚本的格式命令从上向下,从左向右地分析和执行,如果读到一个回车键,就尝试开始执
8、行该行。右图是一个shell脚本第一行#!/bin/bash指明这个脚本使用的解释器是bash,脚本的语法是用bash的语法。例如perl脚本的第一行是#!/usr/bin/perlshell脚本用#号作为一行注释开始。#到行尾之间的内容被视为注释接下来就是程序部分告知执行的成功与否可以用命令exit 来结束脚本的执行,并且传回一个数值给系统。将来可以用$?来获取它传回的值。大家猜一下返回值的范围是多少 ,怎么验证?rootlocalhost # cat helloworld.sh#!/bin/bash#my first shell script#history: 2012.01.01echo
9、 “hello world”exit 0第9页/共48页Shell脚本执行方式一 父进程创建一个子进程,在子进程里运行命令解释器,由解释器读取脚本并执行相应的功能。 假设写完一个脚本文件/home/jim/123.sh后,该如何执行呢? 有以下几种方式: 以bash进程来执行:通过“bash 123.sh” 来执行。 直接命令执行:123.sh文件必须要具备可读与可执行权限:绝对路径:使用/home/jim/123.sh来执行命令;相对路径:假设工作目录在/home/jim/,这可以使用./123.sh来执行;变量“PATH”功能:将123.sh放在PATH指定的目录下,例如:放在/bin/里
10、,则可直接通过文件名123.sh来执行。第10页/共48页Shell环境变量 环境变量的形式通常如:name=value Linux内核并不查看这些字符串,他们的解释完全依赖于各个应用程序。例如,shell就使用了大量的环境变量,其中一些在登录时自动设置,如HOME和USER等,有些则由用户设置。 功能:我们在shell中设置环境变量以控制shell的动作。例如设置了MAIL就告诉shell应该到哪里去取邮件。 显示变量值的命令:echo 用法:echo $variable 例如:在环境变量前加上$就代表使用该变量的值 echo $PATH echo $HOME 查看当前所有Linux环境变量
11、的命令:env第11页/共48页Shell配置文件shell在启动时会读取一些配置文件。下面是bash的配置文件,实际上他们也是shell脚本。/etc目录下的是系统级的配置文件,用户家目录下的两个配置文件是用户的个性化。/etc/profile 设置系统级的环境变量 PATH、HOME、HISTSIZE等。第一次登录时运行该脚本。/.bash_profile 用户可在这里设置环境变量或启动程序。当用户登录时,该文件仅仅执行一次 。/.bashrc 用户可在这里设定别名和函数。启动shell时都会执行该配置文件。 /etc/bashrc 启动shell时运行该脚本。 /.bash_logout
12、 退出shell时执行。第12页/共48页 根据启动shell的方式不同,配置好脚本的执行也有不同:对于login shell:即通过输入用户名和密码登陆或用su - 获得的shell。在shell启动时会按14的顺序依次执行这四个配置脚本。这时获得的是一个完全和用户名相符的shell环境。对于non-login shell:不需登录流程或以su的方式切换用户获得的shell。这种情况下,启动shell时只执行和两个配置脚本。例如,图形界面下启动一个终端,或者在原来的bash环境下再输入bash,都不需要用户名和密码;这两次获得的shell就称为non-login shell。这时许多环境还未
13、改变。比如PATH,因为它是在和中设置的。第13页/共48页变量类型变量是用一固定的字符串或符号来表示一个可变的值。和C语言中相似。有以下几种变量: 用户自定义变量 位置变量 预定义的特殊变量 环境变量(export)第14页/共48页用户自定义变量 变量无须事先声明 变量的可以用字符(a-z A-z)数字和下划线组成,但必须以字符开头。 变量与变量内容(值)用等号连接,等号左右不能有空格对变量赋值#a=“hello shell”打印变量#echo $a第15页/共48页变量引用 $加变量名即可引用该变量的值。例如:$var 使用 可以使变量名和后续字母分开。例如: var=de $varab
14、c的值为deabc $varabc是取变量varabc的值,若之前没有创建过varabc那么它的值为空 未定义的变量值为空第16页/共48页Shell变量赋值 双引号内的字符如 $ ” 等以特殊字符解读。 单引号内的特殊字符全部当做普通字符处理。a=“aa”b=“$a bb”c=$a ccecho $aecho $becho $c第17页/共48页Shell变量赋值 把命令的执行结果赋值给变量(例如ls),用command,或$(command) 注意:是反引号(backquote), 不是单引号(quote)将ls的输出结果作为变量a的值#a=ls 等价于 a=$(ls)打印变量#echo
15、$a第18页/共48页环境变量环境变量是指能被子进程所继承的变量。子进程只会继承父进程的环环境变量是指能被子进程所继承的变量。子进程只会继承父进程的环境变量境变量(1)HOME:用户主目录的全路径名。如/home/myname(2)LOGNAME:即用户注册名 (3)PWD:当前工作目录的路径。 (4)PATH:shell查找命令的路径(目录)列表,各个目录用冒号( : )隔开。 (5)PS1:shell的主提示符。 $ PS1=$LOGNAME (6)SHELL:当前使用的shell。通常,它的值是/bin/bash。 (7)TERM:终端类型。可以用envenv命令列出当前环境下的所有环境
16、变量及其值,也可用echo命令察看任何一个环境变量的值。当更改了环境变量的值以后,往往利用exportexport命令将这些变量输出,使它们成为公用量。例如: $ export HOME PATH PS1用户自定义变量可以通过export命令,变成环境变量。例如:# asdf=1234 执行env,查看是否有变量asdf# export asdf 执行env ,查看是否有变量asdf,这一次asdf变成环境变量第19页/共48页shell脚本的执行方式二 bash进程本身就是个shell脚本解释器,直接由该进程读取shell脚本并执行。好处是:它的执行效果会在当前shell中生效。该方法是通过
17、内置命令source或 . 实现的。 经常用在修改了的bash的配置文件在当前环境下生效,可以使用命令source 或“.”后接配置文件来执行配置脚本。 范例:在/.bashrc里设置了alias别名,想在当前环境立即可用# vim /.bashrc 打开文件,在该文件写入下面一行,保存并退出alias hello=echo “welcome today is $(date +%Y:%m:%d)” # source /.bashrc 或者 . /.bashrc 接下来就可以使用该别名了 在/.bash_profile里将当前用户的家目录加到PATH路径中# vim /.bash_profile
18、 打开文件,写入下面两行,保存并退出PATH=$PATH:$HOMEexport PATH#source /.bash_profile 或者 . /.bash_profile接下来,直接输入家目录下的可执行程序的文件名就可以执行了。第20页/共48页预先定义的特殊变量$当前进程的进程号。$!上一个后台命令对应的进程号。$?上一条命令执行后的返回码,也称退出码。每条命令都有返回码,0代表执行成功,当用于判断式时,表达式为真,非零代表执行失败,用于判断式时,表达式为假。$#除脚本名外,命令行上参数的个数。 $*表示在命令行上实际给出的所有实参。如输入下面的命令行: exam3 A B C D E
19、F G H I J K 则$* 是:A B C D E F G H I J K 而”$*”等价于: “$1 $2 $3”,即:,即:”A B C D E F G H I J K”$它与$*基本功能相同。区别在于当用引号时 ”$”与”$*”不同,”$”参数是彼此分离的。”$”就等价于: $1 $2在上面情况下, “$” 就是“A” “B” “C”“K”第21页/共48页预先定义的特殊变量 变量名为0的值代表正在执行的脚本名称 变量名为1到99的值代表命令行传入的参数。 变量名大于10时,必须用括起来,例如取第十个参数用$10 输入下面的命令行:# exam3 A B C D E F那么 $0的值
20、为exam3 $1到$6的值分别对应A到F 内置命令shift功能:造成参数变量号码偏移 用法:shift n 例如:上面的输入,执行命令 shift 3 之后,这些参数变量从第四个开始对应。 $1的值为D $2为E $3为F $4、$5、$6的值为空 直接shift等价于 shift 1第22页/共48页Shell算术运算 + - * / % 分别对应加、减、乘、除、取余 只需将特定的算术表达式用 “$(” 和 “)” 括起来。a=$(4-2) a的值为2a=10b=2echo $($a+$b)echo $($a-$b)echo $($a*$b)echo $($a/$b)echo $($a%
21、$b)第23页/共48页跟用户交互 用bash内嵌的read命令 功能:读取来自键盘的输入,并传给变量 用法:read 选项 变量名 选项: -p 字符串 后面接字符串给出提示 -t 时间 后接等待的秒数,即不会一直等待用户输入#echo “input your name”#read name上面两行可以用下面一行代替#read -p “input your name” name#echo “my name is $name”第24页/共48页Shell逻辑判断 & 代表AND,即“与” |代表OR,即“或”命令test 和判断符 功能:结合后三页的选项用于字符串、数字、文件目录的测试
22、 测试为真,则返回0,假返回1,可以通过$?得到返回值。常和后面讲到的判断、循环语句结合在一起使用。 中括号 内的每个组件之间都需要有空格键来分隔命令执行情况 说明cmd1 & cmd2 1. 若 cmd1 执行完毕且正确执行($?=0),则开始执行 cmd2。 2. 若 cmd1 执行完毕且为错误 ($?0),则 cmd2 不执行。 cmd1 | cmd2 1. 若 cmd1 执行完毕且正确执行($?=0),则 cmd2 不执行。 2. 若 cmd1 执行完毕且为错误 ($?0),则开始执行 cmd2。第25页/共48页Shell逻辑判断: 检测文件属性-f 检测文件是否存在检测文件
23、是否存在且是普通文件-d 检测目录是否存在检测目录是否存在-e 检测检测文件是否存在,可以是任何是否存在,可以是任何类型文件-r 文件文件对于该用户是否具备可读属性是否具备可读属性-w 是否可写是否可写-x 是否可执行是否可执行 例如: 判断文件/.bashrc是否存在 test -f /.bashrc 又可表示为 -f /.bashrc 判断文件/.bashrc是否可读 test -r /.bashrc 又可表示为 -r /.bashrc 练习:判断用户输入的文件是否存在,若存在输出yesyes否则输出nono第26页/共48页Shell逻辑判断: 算术运算:-eq 等于-ne 不等于-lt
24、 小于-gt 大于-le 小于或等于-ge 大于或等于a=2b=2test $a -eq $b & echo “a equeal to b”上式等价于 $a -eq $b & echo a equeal to b第27页/共48页Shell逻辑判断: 字符串运算符:= 字符串相同则为真!= 字符串不相同则为真-z $str 若变量str的长度等于0则为真-n $str 若变量str的长度大于0则为真,-n可去掉 多重条件判断 -a 要求左右两个语句都成立时才为真。例如test -r file -a -x file 则file同时具有读和执行权限时才为真。上式等价于 test-r
25、 file & test -x file 若前一条语句执行后为假,即返回值非零,后一条语句就不再执行。 -o 任意一条语句为真就都为真。例如test -r file -o -x file 则file具有读或写的权限就为真。上式等价于 test -r file | test -x file 若前一条语句执行后为真,后一条语句就不再执行。 ! 取反状态。如test ! -r file 当file不可读时,才为真。注意:符号“!”放在命令或shell函数的前面,表示对命令返回码取反,例如 “! test -r file”意思是若file可读,这整条语句的返回码非零。第28页/共48页Shel
26、l 条件语句:if 条件判断:条件判断: 最简单的条件判断最简单的条件判断if if 表达式 ; then then 语句fifi 若表达式为真,则执行下面thenthen到之间fifi的语句 表达式可以是多条命令或函数,他们之间用 &或 |彼此相连 ifif语句可以可以写成&或或|的组合组合语句。如下左右两条语句功能相同。 ifif语句可以嵌套使用#!/bin/bashif $# != 1 ; then echo usage: command filename exit 1;fiif test -f $1; then echo file $1 exists!fi#!/bin/
27、bash $# != 1 & echo usage: command filename” & exit 1 -f $1 & echo “file $1 exists!”第29页/共48页Shell 条件语句:if 条件判断:条件判断: 复杂的复杂的if语句:语句:if if 表达式; then ; then 动作elif elif 表达式; then ; then 动作elif elif 表达式; then; then 动作 elseelse 动作fifi#!/bin/bashif $# != 1 ; then echo usage: command number ex
28、it 1;fiif $1 -lt 0 ; then echo $1 is less than 0elif $1 -lt 10 ;then echo $1 is betwen 0 and 9elif $1 -lt 100 ; then echo $1 is between 10 and 99else echo $1 is great equal than 100fi第30页/共48页这个程序用来展示测试语句应用$ cat exam10echo -n key in a number (1-10 ) : #提示输入1-10之间的一个数字,光标不换行read a #读取输入的数字if $a -lt 1
29、 -o $a -gt 10 #如果该数小于1或者大于10then echo Error Number . #显示输入数字有错 exit 2 #退出,返回码为2elif ! $a -lt 5 #否则,若该数不小于5thenecho Its not less 5. #显示不小于5 的信息else echo Its less 5. #否则,显示该数小于5fi #结束if语句echo accept key in value. #显示接受了键入的值第31页/共48页动手小练习 提示用户输入一个数,判断这个数是否是你想要的。想要的就打出 yes,否则就是no。 提示用户输入一个文件/目录,判断这个文件具有
30、哪些属性? 写一个输入新的文件名,就自动创建C源文件的脚本程序第32页/共48页Shell分支判断:case 分支判断 用*代表所有其他值c case $ase $变量名称 in in“第一个变量的内容”) )动作动作1 1; “ “第二个变量内容”)”)动作动作2 2; * *) )动作动作3 3; esac esac#!/bin/bashif $# != 1 ; then echo usage: command number exit 1;ficase $1 in2) echo you input number 2 ;4) echo you input number 4 ;6) echo
31、you input number 6 ;*) echo invalid inputesac第33页/共48页动手练习 提示用户输入一字符串,字符串必须为 “case”或者”esac” ,并打印出来。如果输入的是其他字符串打印出错消息。第34页/共48页Shell循环:forFor循环三种方式:1、像C语言一样使用,适合数值运算 for(语句;条件;语句) do 动作 done2、for 变量名 in 变量值1 变量值2 do 动作 done 3、for 变量名 in $var do 动作 done#!/bin/bashif $# != 1 ;then echo usage: $0 loop_n
32、umber exit 1fisum=0for(i=0;i$1;i+)do sum=$($sum+$i)doneecho “sum is $sum”sum=0for i in abc def mnqdo echo $idone第35页/共48页For循环小练习一系统上面的各种账号都是写在/etc/passwd 内的第一个字段,你能不能通过命令cut找出每个账号的名称,用命令id、finger 输出他们的相关信息呢?二请写一个程序将/etc/passwd 的账号取出,而且每一个账号都以一行字符串The 1 account is “root” 来显示,那个 1 表示行数,双引号里是账号名。三若想让用
33、户输入一个目录名, 然后我找出该目录内的每个文件的读写执行权限,该如何做?四让用户输入一个大于0的数字,程序可以由 1+2+3. 一直累加到用户输入的数字为止,输出结果。 五输出命令行参数,每行列出一个参数。演示$*和$的区别第36页/共48页Shell循环:while一、while 表达式 do 动作 done二、 until 表达式 do 动作 done下面是计算1到loop的和#!/bin/bashif $# != 1 ;then echo input number exit 1fisum=0;loop=$1while $loop -gt 0 do sum=$($sum+$loop) l
34、oop=$($loop-1)doneecho sum is $sumuntil $a = 0 do echo $a; a=$($a-1);done第37页/共48页break/continue Break n 跳出最近的n重循环,默认跳出最近的一重循环 continue 继续循环 练习:一写一个脚本,输出所有的命令行参数。要求:每行输出一个参数,分别用for和while实现。二帮用户找到/usr/目录下文件名以.d为后缀的文件,并将这些文件都拷贝到目标目录下。若找到的文件本身为目录,则不拷贝。第38页/共48页脚本调试 bash -nvx script 参数说明 -n 不执行脚本,只检查脚本的
35、语法,若没有语法错误,则不会显示任何信息 -v 执行脚本前,把每行脚本都输入到屏幕 -x 执行脚本,显示脚本每一行脚本的执行情况。这是非常有用的参数。第39页/共48页Shell函数 shell脚本可以定义函数,将一些命令放在一个函数内,调用函数名即可执行函数内的语句了。类似于C语言函数。 函数若没有被调用,则不会执行 函数也有内置变量。在函数内部,$1,$2.和$ $#对应函数传入的形参。可以在函数内用return表明函数的执行结束。 语法函数名().return 数字 return的返回码也可以通过echo $?获得。 函数定义好以后,就可以在脚本需要的地方像命令一样使用: 函数名 参数 .#!/bin/bashfunction_one() echo function one is calledfunction_two() echo function two is calledif $1 -eq 1 ;then function_oneelif $1 -eq
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 营销工程管理办法
- 蝴蝶图片的课件
- 头晕待查的护理问题
- 高三学期末个人总结
- 肿瘤危重病护理
- 藏族舞基础知识课件下载
- 藏文字母课件
- 我能行健康活动
- 二零二五年酒店厨师团队整体引进聘用合同协议
- 二零二五年度互联网影视平台会员充值卡销售协议
- 2022施工升降机安全生产隐患识别图集
- 哈药集团制药总厂无菌青霉素钠(106车间)新版GMP改造项目哈尔滨市南岗区学府路109号哈药总厂106车间钾转钠楼内哈药集团制药总厂哈
- 建筑工程(一切)险公估作业规范
- 急性脑血管病并发症的预防及处理
- 市场营销实务中职全套教学课件
- 奶水牛养殖可行性研究报告
- 新人教版高中数学选择性必修第一册全套精品课件
- 农业机械设备采购投标方案
- 新公务员法培训课件
- 天然药物化学:03-天然药物的提取分离方法
- 公共基础知识1000题
评论
0/150
提交评论