嵌入式linux操作系统Shell基本概念UNIX主要内容Shell环境概述Shell的作用及常见种类Shell脚本的概念Shell环境的切换编写Shell脚本Bash的常用功能编写Shell管理脚本(一)Shell变量应用编写并执行Shell脚本用户自定义变量环境变量位置变量、预定义变量Shell脚本应用实例执行Shell脚本UNIXShell的作用及常见种类Shell的作用——命令解释器,“翻译官”–介于操作系统内核与用户之间,负责解释命令行Shell计算机用户应用程序Linux内核输入输入控制控制系统硬件输出输出UNIXshell是系统的用户界面,它提供了用户和Linux(内核)之间进行交互操作的一种接口。用户在命令行中输入的每个命令都由shell先解释,然后传给Linux内核去执行。如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层,从shell向Linux操作系统传递命令时,内核就会做出相应的反应。Shell简介UNIX目前流行的ShellKshBshCshBashZsh兼具Bsh的语法和Csh的交互特性70年代中期诞生于贝尔实验室,有较强的脚本编程功能80年代早期诞生于加利福尼亚大学,使用C语言风格,命令交互方便Bsh的升级版,Linux系统中的默认Shell兼具各种Shell程序优点,交互式操作效率更高UNIX特征noclobbernoyessetnoclobberyessetnoclobberyesset-onoclobberyesset-onoclobber别名noyesaliashhistoryyesaliashhistoryyesaliash=historyyesaliash=history历史记录noyes!yes!yes!yes!命令修改noyes^^^yes^^^yes^^^yes^^^命令编辑nonoyesbinkkey-vyesset-oviyesset-ovi:;&shcshtcshbashkshyesyesyesyesyes各种shell的特征UNIXShell程序语言的特点Shell允许通过编程来完成比较复杂的功能处理,但其作为语言与高级语言比较具有不同的特点:Shell是解释性的,多数高级语言是编译性的;Shell语言与高级语言处理的对象不同;Shell与系统有密切的关系;Shell易编写、调试、灵活性较强;Shell作为命令级语言,命令组合功能很强。Shell不适合的应用:资源密集型的任务,尤其在需要考虑效率时(排序,hash等)。需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN来处理)有跨平台移植需求(一般使用C或Java)。复杂的应用,必须使用结构化编程(需要变量的类型检查,函数原型,多维数组的支持。需要数据结构的支持,比如链表或数组等数据结构。需要产生或操作图形化界面GUI。需要直接操作系统硬件。需要I/O或socket接口。需要使用库或者遗留下来的旧代码的接口。个人的、闭源的应用(shell脚本把代码就放在文本文件中,全世界都能看到)。UNIXBashshell的主要特征1•目录处理,包含pushd,popd和dirs命令•一维数组,使得引用与操作数据列表更为简单2•~扩展,替代用户根目录的缩写;•大括号扩展,可以产生任意的字符串3•命令历史,让你记得以前输入的指令•键盘绑定,让你设置自定义编辑的键序列4•集成编程特性,包括test、expr、getopt、echo等,使得编程任务能更简洁有效•控制结构,特别是select结构,能简单生成菜单UNIX如何切换Shell环境临时切换:直接执行其他Shell程序,例如ksh、zsh等更改用户登录Shell:需修改/etc/passwd文件中用户记录的最后一个字段或执行:usermod-sShell程序路径用户名[root@localhost~]#cat/etc/shells/bin/sh/bin/bash/sbin/nologin/bin/tcsh/bin/csh/bin/kshShell环境的切换登录Shell–指用户每次登录系统后自动加载的Shell程序,大多数Linux系统采用/bin/bash作为默认登录Shell–/etc/shells文件记录了系统支持的有效登录ShellUNIXBash的命令历史命令历史–保存用户曾经执行过的命令操作–存放位置:~/.bash_history文件查看历史命令–使用↑、↓按键逐条翻看,允许编辑并重复执行–执行:history清除历史命令–执行:history-c[root@localhostroot]#history……556useraddjerry557passwdjerry558crontab-e-ujerry559crontab-l-ujerryUNIXBash的命令历史调用历史命令–!n:执行历史记录中的第n条命令–!str:执行历史记录中以“str”开头的命令设置记录历史命令的条数–修改HISTSIZE参数(默认为1000条)[root@localhostroot]#!562crontab-l-ujerrynocrontabforjerry[root@localhost~]#vi/etc/profileHISTSIZE=200UNIX##readlistofdirectoriestobebacked-upfrom$dir_filewhilereaddirdocase$dirin\#*)continue;;esac##convertslashes(andspaces)tounderscoresforarchivefilename_gsub${dir%/}'[/]''_'tar_file=$archive_dir/${_GSUB#_}.${datestamp:?}.$bu_age.tar##buildlistofmodifiedfiles;skiptonextdirectoryifnonefile_list=$(find${dir%/}/-typef-mtime$bu_age)[-z$file_list]&&{verbose=3log_it$dir:nonewfiles;continue;}##archivethefileslog_itCreatingarchive:$tar_file{tarcvf$tar_file$file_list|log_it-pARCHIVE=${tar_file##*/}$archive_suffixFILE=$INFO}2&1|log_it##compress$tar_filewithcompressionutilityofchoiceeval${compress:-:}$tar_file2&1|log_it$INFOarchive_file=$tar_file$archive_suffix[-f$archive_file]||log_it$ERROR$archive_filenotcreatedarchive_list=$archive_list$NL$archive_filedone$dir_fileprintfARCHIVEFILE:%s\n$archive_list|log_itShell的例子【部分】1124562456关键字&语句函数条件测试管道重定向67其它3变量3UNIXBash的标准输入输出交互式硬件设备–标准输入:从该设备接收用户输入的数据–标准输出:通过该设备向用户输出数据–标准错误:通过该设备报告执行出错信息类型设备文件文件描述编号默认设备标准输入/dev/stdin0键盘标准输出/dev/stdout1显示器标准错误输出/dev/stderr2显示器/dev/stdin、/dev/stdout、/dev/stderr这三个文件实际上也是一个符号链接UNIXBash的重定向操作改变标准输入、标准输出、标准错误的方向类型操作符用途重定向标准输入将命令中接收输入的途径由默认的键盘更改为指定的文件重定向标准输出将命令的执行结果输出到指定的文件中,而不是直接显示在屏幕上将命令执行的结果追加输出到指定文件重定向标准错误2清空指定文件的内容,并将标准错误信息保存到该文件中2将标准错误信息追加输出到指定的文件中重定向标准输出和标准错误&将标准输出、标准错误的内容全部保存到指定的文件中,而不是直接显示在屏幕上UNIX输入输出重定向输出重定向UNIX标准错误输出重定向标准错误输出重定向012345......Filedescriptorerror-fileKeyboardScreenstdinstdoutstderrPerprocessfiledescriptortablefor‘command’(a)commanderror-filestdinstderrstdout(b)ScreenKeyboardUNIX输入输出重定向#catfile1file2file3cat.output2cat.errors012345......Filedescriptorcat.errorsKeyboardstdinstdoutstderrPerprocessfiledescriptortableforcatcatstderrstdoutcat.outputKeyboardcat.outputcat.errorsstdinfile1file2file3UNIX输入输出重定向#catfile1file2file32cat.errors1&2012345......Filedescriptorcat.errorsKeyboardstdinstdoutstderrPerprocessfiledescriptortableforcatcatcat.outputKeyboardstdinfile1file2file3stderrstdoutcat.errorsUNIXShell的功能和特点-管道管道(Pipeline)若把一条命令的输出作为另一条命令的输入,可使用|(管道)符,例如$ls–s|sort–nr|pg该命令列出当前目录中的所有文件,并把输出送给sort命令作为输入,sort命令按数字递减的顺序把ls的输出排序。然后再把排序后的内容送给pg命令,pg命令在显示器上显示sort命令排序后的内容。管道是增强命令功能的有利工具。UNIXBash的管道操作管道操作符号“|”–连接左右两个命令,将左侧的命令输出的结果,作为右侧命令的输入(处理对象)–格式:cmd1|cmd2[...|cmdn][root@localhost~]#free-m|head-2totalusedfreesharedbufferscachedMem:503339163087199[root@localhost~]#free-m|grepMem|awk'{print$2,$4}'503163awk,以空格或制表位为分隔,输出指定第n列数据UNIX管道(Pipeline)管道stdin/stdout标准输入输出cmd1stdoutofcommand1Pipecmd2stdoutofcommand2Pipestdinofcommand2…PipecmdNstdinofcommandNUNIX管道(Pipeline)#rshservercat~/research/pvm/datafile.server|diffdatafileOnserverdiffScreenstdoutstderrOnthelocalcomputerpipershservercatIP地址或主机名datafile~/research/pvm/datafile.serverUNIXShell变量的应用Shell变量–为灵活管理Linux系统提供特定参数,有两层意思:•变量名:使用固定的名称,由系统预设或用户定义•变量值:能够根据用户设置、系统环境变