




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SHELL 编程序:我们现在使用的是什么shell?一. shell分类几种常见shell简介Linux系统提供多种不同的Shell以供选择。常用的有Bourne Shell(简称sh)、C-Shelll(简称csh)、Korn Shell(简称ksh)和Bourne Again Shell (简称bash)。(1)Bourne Shell是AT&T Bell实验室的 Steven Bourne为AT&T的Unix开发的,它是Unix的默认Shell,也是其它Shell的开发基础。Bourne Shell在编程方面相当优秀,但在处理与用户的交互方面不如其它几种Shell。(2)C Shell是加州伯克利大学的Bill Joy为BSD Unix开发的,与sh不同,它的语法与C语言很相似。它提供了Bourne Shell所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C Shell与BourneShell并不兼容。(3)Korn Shell是AT&T Bell实验室的David Korn开发的,它集合了C Shell和Bourne Shell的优点,并且与Bourne Shell向下完全兼容。Korn Shell的效率很高,其命令交互界面和编程交互界面都很好。(4)Bourne Again Shell (即bash)是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。二. 一个Bash例程1. 编写并保存以下代码例程 1.1 清空日志文件#!/bin/bash # 一个Bash脚本的正确的开头部分. LOG_DIR=/var/log # 如果使用变量,当然比把代码写死的好. cd $LOG_DIR cat /dev/null messages cat /dev/null wtmp echo Logs cleaned up. exit # 这个命令是一种正确并且合适的退出脚本的方法.例程 1.2 以下是上面例程的改进代码段1 #!/bin/bash 2 # 清除, 版本 3 3 4 # 警告: 5 # - 6 # 这个脚本有好多特征, 7 #+ 这些特征是在后边章节进行解释的. 8 # 大概是进行到本书的一半的时候, 9 #+ 你就会觉得它没有什么神秘的了. 10 11 12 13 LOG_DIR=/var/log 14 ROOT_UID=0 # $UID为0的时候,用户才具有root用户的权限 15 LINES=50 # 默认的保存行数 16 E_XCD=66 # 不能修改目录? 17 E_NOTROOT=67 # 非root用户将以error退出 18 19 20 # 当然要使用root用户来运行. 21 if $UID -ne $ROOT_UID 22 then 23 echo Must be root to run this script. 24 exit $E_NOTROOT 25 fi 26 27 if -n $1 28 # 测试是否有命令行参数(非空). 29 then 30 lines=$1 31 else 32 lines=$LINES # 默认,如果不在命令行中指定. 33 fi 34 35 36 # Stephane Chazelas 建议使用下边 37 #+ 的更好方法来检测命令行参数. 38 #+ 但对于这章来说还是有点超前. 39 # 40 # E_WRONGARGS=65 # 非数值参数(错误的参数格式) 41 # 42 # case $1 in 43 # ) lines=50; 44 # *!0-9*) echo Usage: basename $0 file-to-cleanup; exit $E_WRONGARGS; 45 # * ) lines=$1; 46 # esac 47 # 48 #* 直到Loops的章节才会对上边的内容进行详细的描述. 49 50 51 cd $LOG_DIR 52 53 if pwd != $LOG_DIR # 或者 if $PWD != $LOG_DIR 54 # 不在 /var/log中? 55 then 56 echo Cant change to $LOG_DIR. 57 exit $E_XCD 58 fi # 在处理log file之前,再确认一遍当前目录是否正确. 59 60 # 更有效率的做法是: 61 # 62 # cd /var/log | 63 # echo Cannot change to necessary directory. &2 64 # exit $E_XCD; 65 # 66 67 68 69 70 tail -$lines messages mesg.temp # 保存log file消息的最后部分. 71 mv mesg.temp messages # 变为新的log目录. 72 73 74 # cat /dev/null messages 75 #* 不再需要了,使用上边的方法更安全. 76 77 cat /dev/null wtmp # : wtmp 和 wtmp具有相同的作用 78 echo Logs cleaned up. 79 80 exit 0 81 # 退出之前返回0, 82 #+ 返回0表示成功.例程 1.3 显示日期、时间1 #!/bin/bash2 # 练习date命令3 4 echo The number of days since the years beginning is date +%j.5 # 需要在调用格式的前边加上一个+号.6 # %j用来给出今天是本年度的第几天. 7 8 echo The number of seconds elapsed since 01/01/1970 is date +%s.9 # %s将产生从UNIX 元年到现在为止的秒数,10 #+ 但是这东西现在还有用么?11 12 prefix=temp13 suffix=$(date +%s) # date命令的+%s选项是GNU特性.14 filename=$prefix.$suffix15 echo $filename16 # 这是一种非常好的产生唯一临时文件的办法,17 #+ 甚至比使用$都强.18 19 # 如果想了解date命令的更多选项, 请查阅这个命令的man页.20 21 exit 02. 执行编写完脚本之后,你可以使用sh scriptname, 1 或者bash scriptname来调用这个脚本. (不推荐使用sh scriptname, 因为这禁用了脚本从stdin中读数据的功能. ) 更方便的方法是让脚本本身就具有可执行权限, 通过chmod命令可以修改. 比如: chmod 555 scriptname (允许任何人都具有可读和执行权限) 2 或者 chmod +rx scriptname (允许任何人都具有可读和执行权限) chmod u+rx scriptname (只给脚本的所有者可读和执行权限) 既然脚本已经具有了可执行权限,现在你可以使用:./scriptname 来测试这个脚本了. 如果这个脚本以一个#!行开头, 那么脚本将会调用合适的命令解释器来运行. 三. 一个TC Shell例程例1:变量定义与从键盘输入变量的值#!/bin/tcsh set var_new = hahaha loloecho vbvbvb $var_newset var_b=$echo user input $var_b.注意:执行时应使用以下方式:/bin/tcsh scriptname变量 输入/输出、重定向 使程序在后台/前台运行内置参数 练习一. 变量的定义、赋值、引用、删除echo:显示变量的内容env:显示系统所有环境变量set:显示系统所有变量export:导出变量使之在子进程中也可以使用unset:删除变量例2-1. 变量的赋值与替换#!/bin/bash# 变量赋值和替换a=375hello=$a#-# 强烈注意, 在赋值的的时候, 等号前后一定不要有空格.考虑如果出现空格会怎么样?#-echo hello # 没有变量引用, 只是个hello字符串.echo $helloecho $hello # 同上.echo $helloecho $helloechohello=A B C Decho $hello # A B C Decho $hello # A B C D# 就象你看到的echo $hello 和 echo $hello 将给出不同的结果.echo $hello # $hello# 全引用的作用将会导致$被解释为单独的字符,而不是变量前缀. hello= # 设置为空值.echo $hello (null value) = $hello# 注意设置一个变量为null, 与unset这个变量, 并不是一回事,虽然最终的结果相同(具体见下边).# -echo; echonumbers=one two three# other_numbers=1 2 3# # 如果在变量值中存在空白, 那么就必须在赋值时加上引用.# other_numbers=1 2 3 # 将给出一个错误消息. echo numbers = $numbersecho other_numbers = $other_numbers # other_numbers = 1 2 3echo uninitialized_variable = $uninitialized_variable# Uninitialized变量为null(就是没有值). uninitialized_variable= # 声明, 但是没有初始化这个变量, #其实和前边设置为空值的作用是一样的. echo uninitialized_variable = $uninitialized_variable# 还是一个空值.uninitialized_variable=23 # 赋值.unset uninitialized_variable # Unset这个变量.echo uninitialized_variable = $uninitialized_variable# 还是一个空值.echoexit 0例2-2. 变量赋值#!/bin/bash# 等号赋值a=879echo The value of a is $a.# 使用let赋值let a=16+5echo The value of a is now $a.echo The value of a is now $a.# 在for循环中赋值(事实上, 这是一种伪赋值):echo -n Values of a in the loop are: #-for a in 7 8 9 11do echo -n $a doneecho#-#使用read命令进行赋值(这也是一种赋值的类型):echo -n Enter a: read aecho The value of a is now $a.#-b=$aecho $b# 现在让我们来点小变化(命令替换).c=echo Hello! # 把echo命令的结果传给变量aecho $cc=ls -l # 把ls -l的结果赋值给aecho $c #然而, 如果没有引号的话将会删除ls结果中多余的tab和换行符.echo $c #如果加上引号的话, 那么就会保留ls结果中的空白符.#命令替换也可以通过( )实现R=$(cat /etc/redhat-release)arch=$(uname -m)echo $R; echo $archexit 0例2-3. 进行浮点运算#!/bin/bashecho -n Inpute a:read aecho -n Input b:read b#将文件afile中保存的运算交由bc执行n=bc afile #n=cat afile | bc echo $n#计算a,b的乘积,包括浮点数c=echo scale=3;$a*$b | bc_文件afile的内容就是bc可以接受的运算及处理#cat afilescale=3for(i=1;i 、 、21. 文件描述符:与某个打开的文件相关联的数字(相当于C语言是的文件号)文件描述符代表的文件0标准输入文件1标准输出文件2标准错误输入文件n其它打开的文件注:1) 要关闭某文件描述符,使用: exec n&-2) 将数据同时输出到标准输出设备(屏幕) 和文件,需要使用tee.tee的语法如下:tee option. file. options: -a -将输出追加到文件后-i -忽略中断信号2.示例$cat #cat把键盘看作标准输入,屏幕看作标准输出。按下CTRL+D结束键盘输入$cat sample.txt$cat /dev/null /var/log/messages$cat xhold$cat x yhold$cat x y | tr a-z A-Z$cat x y 1hold1 2hold2$ls | lpr$who | sort$ls | less$exec 1fd1.out #将以后所有命令的输出都定向到fd1.out$cmd 1file$cmd 1file$cmd 1file1 2file2 $ln -s ch05.doc ./docs /tmp/ln.log 2/dev/null$rm -rf /tmp/my_tmp_dir /dev/null 2&1$who | tee file.a | wc -l例:2-4 将循环的输出重新排序#!/bin/bashfor i in 7 9 2 4 5 12doecho $idone | sort -nexit 0例:2-5 输入重定向(利用read读入文件/etc/fstab的前两行)#!/bin/bash# 从/etc/fstab中读行.File=/etc/fstab read line1 read line2 logfile例2-7:将一个文件描述符输出到另一个文件描述符#!/bin/bashexec 4out.txtexec 5&4date 1&5例2-8: 将所有查找到的文件(在工作目录下过去24小时内修改过的文件)打一个包#!/bin/bash tar -zcvf lastmod.tar.gz find . -mtime -1 -type f -print三. 变量置换名称语法 描述缺省值置换$param:-word若param的值为空或未赋值, word取代param,否则返回param的值.但param的值不变缺省值赋值$param:=word若param的值为空或未赋值,word 值被赋给param,,否则保持不变空值错误 $param:?msg若param的值为空或未赋值,将msg 信息输出到STDERR,并且退出shell有值置换 $param:+word若param有值,word取代param的值, 但param的值不变提取子串$value:offset$value:offset:length从变量中提取子串,这里offset和length可以是算术表达式.获得变量字符个数$#value变量的字符个数 (变量的字符个数,并不是变量个数)删除前部匹配$value#pattern$value#pattern去掉value中与pattern相匹配的部分,条件是value的开头与pattern相匹配, #与#的区别在于一个是最短匹配模式,一个是最长匹配模式.删除尾部匹配$value%pattern$value%pattern与#,#类似,只是是从value的尾部与pattern相匹配变量内容的替换$value/pattern/string$value/pattern/string进行变量内容的替换,把与pattern匹配的部分替换为string的内容,/与/的区别与上同例:myfruit=pearfruit=$myfruit:-appleecho When myfruit is set ,fruit is :$fruitunset myfruitfruit=$myfruit:-appleecho When myfruit is unset ,fruit is :$fruit-unset var_xecho When var_x is unset ,var_x is :$var_xecho Now var_x is: $var_x:=shalala-unset var_x$var_x:?The var_x is undefined或$HOME:?Your home directory is undefined-var_x=beijing 2008 echo $var_x:+aoyun beijingecho var_x is :$var_x unset var_x echo $var_x:+aoyun beijingecho var_x is :$var_x练习:1.如果变量MYPATH没有被赋值,那么下面两个命令会执行怎样的动作,有何不同$MYPATH:=/usr/bin:/usr/sbin;/usr/ucb$MYPATH:-/usr/bin:/usr/sbin;/usr/ucb2.将当前目录下以某些字符开头的文件名,更改成以其它字符(参照Bash Shell编程手册之例9-19-修改文件扩展名)3.若变量a=beijing 2008,请用变量内容替换的方法将beijing更换为paris,2008替换为2012四. 在前台/后台运行程序(fg、bg)、显示当前作业列表(jobs)教材 P235例2-9:在后台运行某命令$ls -l | lpr &CONTROL+Z :将作业从前台移到后台例2-10:将3号作业移到前台$fg 3例2-11:将3号作业移到后台$bg 3例2-12:终止某个作业$ps | grep XXX #找到作业的进程号PID$kill n五. BASH内部命令参考$info bash六. 位置参量和命令行参数例2-13:命令行参数的简单示例#!/bin/bashecho $0 $1 and $2echo The number of para is $#set Jake Nicky Scottecho Para number is :$#All the para is :$*位置参量指代对象$0代表脚本名$#参数的个数$*列出所有位置参数$同上$*扩展为单个变量(例如:$1$2$3)$扩展为多个单独的变量(例如:$1,$2,$3)$1.$10注: shift命令会重新分配位置参数, 其实就是把所有的位置参数都向左移动一个位置.特殊参数:$: shell进程的PID号$!: 后台运行的进程的PID号$?: 退出状态 例2-14:用shift移动参数#!/bin/bashuntil -z $1 # 直到所有的位置参数都被存取完.do echo -n $1 shiftdoneecho exit 0例 2-15 getopts处理命令行选项#!/bin/bashwhile getopts xy options 2/dev/nulldo case $options in x) echo you entered x ; y) echo you entered y ; ?) echo only -x and -y are valid options 1&2 ; esacdoneexit 0例 2-16 getopts 与$OPTARG#!/bin/bashwhile getopts dq: optionsdo case $options in d) echo you entered d ; q) echo the argument for -q is $OPTARG ; ?) echo Usage:opts3 -dq filename. 1&2 ; esacdoneexit 0. 课堂练习2_1. 编写bash脚本:定义两个变量,从键盘给它们输入数字值,屏幕输出两个变量相加的结果。2_2. 编写bash脚本:将前一天修改过的文件名按字母顺序保存在用户主目录的一个文件中;将当前目录下所有以a或A打头的文件设置为可运行(find . -exec .)。2_3.编写脚本,用read逐行读取某文件,并输出.2_4.利用脚本参数的方法,将执行脚本时指定的两个参数文件合并到第三个参数指定的文件中.(即通过./main a b c,能将文件a,文件b的内容合并输出到文件c中)2_5.说明下一段代码的执行结果:exec 4o.txtexec 5&4exec 1&5date其它.附:bash内置参数PPID : 该bash的呼叫者process ID.PWD : 目前的工作目录。OLDPWD : 上一个工作目录。REPLY : 当read命令没有参数时,直接设在REPLY上。UID : User ID。EUID : Effective User ID。BASH : Bash的完整路径。BASH_VERSION : Bash版本。SHLVL : 每次有Bash执行时,数字加一。RANDOM : 每次这个参数被用到时,就会产生一个乱数在RANDOM上。SECONDS : 从这个Shell一开始启动後的时间。LINENO : Script的行数。HISTCMD : 历史记录数。OPTARG : getopts处理的最後一个选项参数。OPTIND : 下一个要由getopts所处理的参数号码。HOSTTYPE : 机器种类。OSTYPE : 作业系统名称。IFS : Internal Field Separator。PATH : 命令搜寻路径。PATH=/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.HOME : 目前使用者的home directory;CDPATH : cd命令的搜寻路径。ENV : 如果这个参数被设定,每次有shell script被执行时,将会执行它所设定的档名做为环境设定。MAIL : 如果这个参数被设定,而且MAILPATH没有被设定,那麽有信件进来时,bash会通知使用者。MAILCHECK : 设定多久时间检查邮件一次。MAILPATH : 一串的邮件检查路径。MAIL_WARNING : 如果有设定的话,邮件被读取後,将会显示讯息。PS1 : 提示讯息设定,内定为bash$ 。(请详见提示讯息一节。)PS2 : 第二提示讯息设定,内定为 。PS3 : select命令所使用的提示讯息。PS4 : 执行追踪时用的提示讯息设定,内定为+ 。HISTSIZE : 命令历史记录量,内定为500。HISTFILE : 历史记录档,内定/.bash_history。HISTFILESIZE : 历史记录档行数最大值,内定500。OPTERR : 如果设为1,bash会显示getopts的错误。PROMPT_COMMAND : 如果设定的话,该值会在每次执行命令前都显示。IGNOREEOF : 将EOF值当成输入,内定为10。TMOUT : 如果设为大於零,该值被解译为输入等待秒数。若无输入,当成没有输入。FCEDIT : fc命令的内定编辑器。FIGNORE : 请详见READLINE。INPUTRC : readline的startup file,内定/.inputrcnotify : 如果设定了,bash立即报告被终结的背景程式。history_control, HISTCONTROL : history使用。command_oriented_history : 存入多行指令。glob_dot_filenames : 如果设定了,bash将会把.包含入档案路径中。allow_null_glob_expansion : 如果设定了,bash允许路径明称为null string。histchars : history使用。nolinks : 如果设定了,执行指令时,不会跟随symbolic links。hostname_completion_file, HOSTFILE : 包含与/etc/hosts相同格式的档名。noclobber : 如果设定了,Bash不会覆写任何由、&及所操作的档案。auto_resume : 请见任务控制一节。no_exit_on_failed_exec : 如果该值存在,非互动的shell不会因为exec失败而跳出。cdable_vars : 如果启动,而cd命令找不到目录,可切换到参数形态指定的目录下。一.条件 返回1. if语句if .; then .elif .; then .else .fi 2.case 分支case . in .) do something here esac 大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等.通常用 来表示条件测试。注意这里的空格很重要。要确保方括号的空格。 -f somefile :判断是否是一个文件 -x /bin/ls :判断/bin/ls是否存在并有可执行权限 -n $var :判断$var变量是否有值 $a = $b :判断$a和$b是否相等 :条件测试. 条件测试表达式放在 中. :是一个扩展的 命令, 结构比 结构更加通用. 使用 . 条件判断结构, 而不是 . , 能够防止脚本中的许多逻辑错误. 比如, &, |, 操作符能够正常存在于 条件判断结构中, 但是如果出现在 结构中的话, 会报错.( ) :整数扩展. 扩展并计算在( )中的整数表达式. 双圆括号结构也被认为是在Bash中使用C语言风格操作变量的一种处理机制.v 文件测试操作符如果下面的条件成立将会返回真.-e 文件存在-a 文件存在,这个选项的效果与-e相同. 但是它已经被弃用了, 并且不鼓励使用.-f 表示这个文件是一个一般文件(并不是目录或者设备文件)-s 文件大小不为零-d 表示这是一个目录-b 表示这是一个块设备(软盘, 光驱, 等等.) -c 表示这是一个字符设备(键盘, modem, 声卡, 等等.)-p 这个文件是一个管道-h 这是一个符号链接-L 这是一个符号链接-S 表示这是一个socket-t 文件(描述符)被关联到一个终端设备上,这个测试选项一般被用来检测脚本中的stdin( -t 0 ) 或者stdout( -t 1 )是否来自于一个终端. -r 文件是否具有可读权限(指的是正在运行这个测试命令的用户是否具有读权限)-w 文件是否具有可写权限(指的是正在运行这个测试命令的用户是否具有写权限)-x 文件是否具有可执行权限(指的是正在运行这个测试命令的用户是否具有可执行权限)-g set-group-id(sgid)标记被设置到文件或目录上,如果目录具有sgid标记的话, 那么在这个目录下所创建的文件将属于拥有这个目录的用户组, 而不必是创建这个文件的用户组. 这个特性对于在一个工作组中共享目录非常有用. -u set-user-id (suid)标记被设置到文件上,如果一个root用户所拥有的二进制可执行文件设置了set-user-id标记位的话, 那么普通用户也会以root权限来运行这个文件. 1 这对于需要访问系统硬件的执行程序(比如pppd和cdrecord)非常有用. 如果没有suid标志的话, 这些二进制执行程序是不能够被非root用户调用的.-k 设置粘贴位 对于粘贴位的一般了解, save-text-mode标志是一个文件权限的特殊类型. 如果文件设置了这个标志, 那么这个文件将会被保存到缓存中, 这样可以提高访问速度. 2 粘贴位如果设置在目录中, 那么它将限制写权限. 对于设置了粘贴位的文件或目录, 在它们的权限标记列中将会显示t.-O 判断你是否是文件的拥有者-G 文件的group-id是否与你的相同-N 从文件上一次被读取到现在为止, 文件是否被修改过f1 -nt f2 文件f1比文件f2新f1 -ot f2 文件f1比文件f2旧f1 -ef f2 文件f1和文件f2是相同文件的硬链接! 非 - 反转上边所有测试的结果(如果没给出条件, 那么返回真).v 整数比较操作符-eq 等于 如: if $a -eq $b -ne 不等于 if $a -ne $b -gt 大于 if $a -gt $b -ge 大于等于 if $a -ge $b -lt 小于 if $a -lt $b -le 小于等于 if $a -le $b 小于(在双括号中使用) ($a $b)= 小于等于(在双括号中使用) ($a 大于(在双括号中使用) ($a $b)= 大于等于(在双括号中使用) ($a = $b)v 字符串比较操作符= 等于 if $a = $b = 等于 if $a = $b ,与=等价.!= 不等号 if $a != $b ,这个操作符将在 . 结构中使用模式匹配. 小于, 按照ASCII字符进行排序,if $a $b ,if $a $b ,注意 大于, 按照ASCII字符进行排序 if $a $b ,if $a $b ,注意使用在 结构中的时候需要被转义.-z 字符串为null, 意思就是字符串长度为零-n 字符串不为null.例3-1:判断输入的用户名是否存在 #!/bin/bashecho -n Please input user name:read namegrep $name /etc/passwd /dev/null 2&1if $? -eq 0 ; thenecho $name existexit 0elseecho $name not existexit 1fi例3-2:一个简单的条件例程#!/bin/bashecho -n Are you ok?read ansif $ans = Y -o $ans = y ; thenecho Glad to hear itelif $ans = N -o $ans = n ; thenecho then let us wait a minuteelseecho what is your mean?fiexit 0例3-3:查找30天以内修改过的、大小大于某值的文件#!/bin/bashif ( $# != 2 ); thenecho Usage: $0 modi_days size 1&2exit 1fiif ( $1 30 ) ; thenecho modi_days is out of rangeexit 2fiif ( $2 = 20 ) ; thenecho The size is out of rangeexit 3fifind -xdev -mtime $1 -size +$2exit 0例3-4:判断某个文件的属性 #!/bin/bashecho -n Input file name:read fileif -d $file ; thenecho $file is a directory elif -f $file ; then if -r $file -a -w $file -a -x $file ; then echo you have read write and execute permission on $file. fielseecho $file is neither a file nor a directoryfiexit 0例3-5:下面的脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件: #!/bin/sh ftype=file $1 case $ftype in $1: Zip archive*) unzip $1 $1: gzip compressed*) gunzip $1 $1: bzip2 compressed*) bunzip2 $1 *) error File $1 can not be uncompressed with smartzip; esac 二.循环 返回需掌握以下内容:v for 结构循环v while 结构循环v untile 结构循环v select 结构循环v 循环嵌套v break,continue 跳出循环,继续循环例3-6:显示所有命令行参数 #!/bin/bashfor i in $ #$*doecho $idoneexit 0例3-7:给多个人发送同一封信$cat mylistcommypattyannyjack$cat mailer#!/bin/bashfor person in $(cat mylist)domail $person letterecho $person was sent a letterdoneexit 0例3-8:为多个文件建立备份#!/bin/bashdir /home/jody/backupscriptsfor file in memo1-5doif -f $file ; thencp $file $dir/$file.bakecho “$file in backed up in $dir”fidoneexit 0例3-9. 在目录的所有文件中查找源字串 #!/bin/bash # findstring.sh: # 在一个指定目录的所有文件中查找一个特定的字符串. directory=/usr/bin/ fstring=Free Software Foundation # 查看哪个文件中包含FSF. for file in $( find $directory -type f -name * | sort ) do strings -f $file | grep $fstring | sed -e s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二硫化碳生产工技能巩固考核试卷及答案
- 鱼油提炼工职业考核试卷及答案
- 穿经工效率提升考核试卷及答案
- 废纸制浆工异常处理考核试卷及答案
- 环己烷装置操作工突发故障应对考核试卷及答案
- 沼气工内部技能考核试卷及答案
- 食品加工设备供货质量保证措施
- 管线工程冬雨季施工环保节能措施
- 2024-2025学年云南省昭通市昭阳区二年级(下)期末数学试卷
- 建筑工地冬季防滑措施
- 《忆秦娥~ 娄山关》
- 新八年级上册数学开学第一课
- 安全挂梯施工方案
- 高速铁路接触网运行维修规则
- 《项目管理飞行检查管理办法》宣贯交底
- 易制爆化学品危险物品单位治安防范情况检查评估表
- 干熄焦余热发电安全预评价送审
- 中国传统艺术-篆刻、书法、水墨画体验与欣赏-哈尔滨工业大学中国大学mooc课后章节答案期末考试题库2023年
- 宾馆承包合同协议书
- 血透室进修汇报专业知识
- 2023年天津卷英语高考真题
评论
0/150
提交评论