开发工具:
文件大小: 166kb
下载次数: 0
上传时间: 2019-07-28
详细说明:脚本编程的基本语句详解,适合初学者,还有一些实例辅助学习。本,并捋结果输出到标准输出(屏幕)。该命合采用正则表达式(见参考)进行搜索。
不要和she中的通配符相混淆。
比如:将 linuxfocus替换为
LinuxFocus cat text file sed's/linuxfocus/Linux Focus/'>newtextfile
awk:awk用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用
F指定其他分割符。
cat file. txt awk-F,' print$1","$3}这里我们使用,作为字段分割符,同时打印第
一个和第三个字段。如果该文件内容如下: Adam bor,34, IndiaKerry miller,2
USA
命合输出结果为: Adam Bor, IndiaKerry Miller,USA
2)概念:管道,重定向和 backtick
这些不是系统命合,但是他们真的很重要。
管道()将一个命合的输出作为另外一个命合的输入。
grep hello" file. txt wc
在 file.txt中搜索包含有"hel"的行并计算其行数
在这里grep命合的输出作为wo命合的输。当然您可以使用多个命合。
重定向:捋命命的结果输出到文件,而不是标准输出(屏幕)。
〉写入文件并覆盖|旧文件
>加到文件的尾部,保留旧文件内容
反短斜线
使用反短斜线可以捋一个命合的输出作为另外一个命合的一个命合行参数。
命合:
find. -mtime- type f-print
用来查找过去24小时(- mtime-2则表示过去48小时)内修改过的文件。如果您
想捋所有査找到的文件打一个包,则可以使用以下脚本
#I/bin/sh
The ticks are backticks()not normal quotes()
tar -cvf lastmod. tar gz find. -mtime -1 -type f -print
3)流程控制
1.if
"if”表达式如果梟件为真则执行then后面的部分
if…;then
eif…then
else
大多数情况下,可以使用测试命合来对粲件进行测试。比如可以比较字符串、判断
文件
是否存在及是否可读等等…
通常用"[]来表示粲件测试。注意这里的空格很重要。要确保方括号里的空格。
[-f" somefile"]:判断是否是一个文件
[-x"/bin/s"]:判断bin/s是否存在并有可执行权限
[-n"$var"]:判断$var变量是否有值
"$a"="$b"]:判断$a和$b是否相等
执行 man test可以查看所有测试表达式可以比较和判断的类型。
直接执行以下脚本
# /bin/sh
if[ s shell=/bin/bash" ]; then
echo your login shell is the bash(bourne again shell)
else
echo your login shell is not bash but $SHELL
f
变量$ SHELL包含了登录shl的名称,我们和/bin/bash进行了比较。
快捷操作符
熟悉C语言的朋友可能会很喜欢下面的表达式
[-f /etc/shadow ]&& echo This computer uses shadow passwors
这里&&就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。
您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/ shadow文件存在
则打印” This computer uses shadow password”。同样或操作()在shel编程中也是
可用的。这里有个例子:
#l bin/sh
mailfolder-/var/spool/ mail/james
L-r Smailfolder"] echo Can not read Smailfolder; exit 1
echo Smailfolder has mail from
grep From $ mailfolder
该脚本首先判断 mailfolder是否可读。如果可读则打印该文件中的"From"一行。如
果不可读
则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个
命爷:
打印错误信息
退出程序
我们使用花括号以匿名函数的形式捋两个命合放到一起作为一个命合使用。
般函数将在下文提及。
不用与和或操作符,我们也可以用讦表达式作任何事情,但是使用与或操作符会
更便利很多。
2. case
case:表达式可以用来匹配一个给定的字符串,而不是数字。
case.. in
do something here
esac
让我们看一个例子。fle命合可以辨别出一个给定文件的文件类型,比如:fi
f
这捋返回
If gz: gzip compressed data, deflated, original filename
last modified: Mon Aug 2723: 09: 18 2001, os: Uni
我们利用这一点写了一个叫做 smartrip的脚本,该脚本可以自动解压bzip2, g2p
和zip类型的压缩文件
# /bin/sh
ftype=file $
case Sftp
e n
$1: Zip archive*)
unz
ip"$1";
$1: gzip compressed"*
gunzip $
$1: bzip2 compressed*)
bunzip2 $
*)echo File $1 can not be uncompressed with smartzip
esac
您可能注意到我们在这里使用了一个特殊的变量$1。该变量包含了传递给该程
序的第一个参数值。
也就是说,当我们运行
smartzip articles zip
$1就是字符串 articles. zip
3. select
select表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组
不同的值中进行选择。
select var in….;do
break
done
now $var can be used
下面是一个例子
# /bin/sh
echo What is your favourite OS?
select var in" Gnu hurd"Free BSDOther. do
break
done
echo You have selected Svar
下面是该脚本运行的结果
What is your favourite os?
1)Linux
2)Gnu Hurd
3)Free BSD
4)Other
#?1
You have selected Linux
4.loop
loop表达式
While…;do
done
hile-loop将运行直到表达式测试为真。 will run while the expression that we
test for is true
关键字" break用来跳岀循环。而关键字" continue"用来不执行余下的部分而直接
跳到下一个循环。
for-loop表达式查看一个字符串列表(字符串用空格分隔)然后捋其赋给一个变
量
f。 or var in..do
one
在下面的例子中,将分别打印ABC到屏幕上
# l /bin/sh
for var inaba. do
echo var is Svar
done
下面是一个更为有用的脚本 showrpm,其功能是打印一些RPM包的统计信息
# /bin/sh
list a content summary of a number of RPm packages
USAGE: showrpm rpmfile 1 rpmfile2
EXAMPLE: showrpm /cdrom/RedHat/RPMS/ *. rpm
for rpmpackage in $ do
if[ -r Srpmpackage" then
echo
Srp
pmpackage
rpm -qi -p irpmpackage
else
echo ERROR: cannot read file Srpmpackage
fi
done
这里出现了第二个特殊的变量$*,该变量包含了所有输入的命合行参数值。
如果您运行 showrpm openssh rpm w3 m rpm webgrep. rpm
此时$*包含了3个字符串,即 openssh. rpm,w3 m rpm and webgrep rpm
5.引号
在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程
序会把通配符
(比如*替换成合适的文件名,它变量替换成变量值。为了防止程序作这种替换,
您可以使用
引号:让我们来看一个例子,假设在当前目录下有一些文件,两个jpg文件, mail. jpg
和 tux jpg
1.2编译 SHELL脚本
#ch#! /bin/sh mod +x filename
cho*jg∪缓螅梢酝ⅱ淙耄?./ filename来执行您的脚本。
这将打印出" mail. jpg tux jpg"的结果。
引号(单引号和双引号)将防止这种通配符扩展
# /bin/sh
echo"米jpg
echo^‘*jpg
这将打印*jpg"两次。
单引号更严格一些。它可以防止任何变量扩展。双引号可以防止通配符扩展但
允许变量扩展。
#l /bin/sh
echo SSHELL
echo SSHELL
echo'SSHELL
运行结果为:
/bin/bash
/bin/bash
SSHELL
最后,还有一种防止这种扩展的方法,那就是使用转义字符—反斜杆
ho米
echo SSHELL
这将输出
*」pg
SSHELL
6. Here documents
当要将几行文字传递给一个命合时, here documents(译者注:目前还没有见到
过对该词适合的翻译)
种不错的方法。对何个脚本写一段帮助性的文字是很有用的,此时如果我们四有
那个 here documents
就不必用echo函数一行行输出。一个" Here document"以<开头,后面接上
个字符串,这个字符串
还必须出现在 here document的末尾。下面是一个例子,在该例子中,我们对多个文
件进行重命名,并且
使用 here documents打印帮助
#l bin/sh
we have less than 3 arguments. print the help text
i[$井t3];then
cat ren --renames a number of files using sed regular expressions
USAGE: ren regexpreplacement' files
EXAMPLE: rename all * htM files in x . html
ren 'HTM$htm’*HTM
HELP
exit o
f
OLD=$
NEW=$
the shift command removes one argument from the list of
command line arguments
shift
shift
#S* contains now all the files
for file in$米;do
if [-f sfile"]; then
newfile=echo"" sed "S/OLD]/NEW/g
if[-f newfie"]; then
echo ERROR: Snewfile exists already
else
echo renaming $file to Snewfile
my Sfile Newfie
fi
done
这是一个复杂一些的例子。让我们详细讨论一下。第一个表达式利断输入命合
行参数是
否小于3个(特殊变量$#表示乞含参数的个数)。如果输廴参数小于3个,则捋帮
助文字传递
给cat命爷,然后由cat命合捋其打印在屏幕上。打印帮助文字后程序退出。如果
输入参数等
于或大于3个,我们就捋第一个参数赋值给变量OLD,第二个参数赋值给变量NEW。
下一步,我
们使用shⅰf命合捋第一个和第二个参数从参数列表中删除,这样原来的第三个参
数就成为参
数列表$*的第一个参数。然后我们开始循环,命合行参数列表被一个接一个地被赋
值给变量$fle。
接着我们判断该文件是否存在,如果存在则通过sed命合搜索和替换来产生新的
文件名。然后
捋反短斜线内命合结果赋值给 newfile。这样我们就达到了我们的目的:得到了旧
文件名和新
文件名。然后使用mv命爷进行重命名。
4)函数
如果您写了一些褙微复杂一些的程序,您就会发现在程序中可能在几个地方使用
了相同的代码,
并且您也会发现,如果我们使用了函数,会方便很多。一个函数是这个样子的:
functionnameo
inside the body $1 is the first argument given to the function
#$2 the second
您需要在每个程序的开始对图数进行声明。
下面是一个叫做κ titlebar的脚本,使用这个脚本您可以改变终端窗口的名称。
这里使用了一个叫做hel的函数。正如您可以看到的那样,这个定义的函数被使用
了两次。
# /bin/sh
vim: set sw=4 ts=4et
helpo
cat titlebar - change the name of an xterm gnome-terminal or kde konsole
USAGE: Titlebar [-h] string for titelbar
OPTIONS: -h help text
EXAMPLE: titlebar cvs
HELP
exit o
in case of error or if -h is given we call the function help
[-z"$1"]&&help
["$1"="h"]&&help
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.