关于Shell编程的一些讨论.docx
- 文档编号:9260566
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:63
- 大小:62.69KB
关于Shell编程的一些讨论.docx
《关于Shell编程的一些讨论.docx》由会员分享,可在线阅读,更多相关《关于Shell编程的一些讨论.docx(63页珍藏版)》请在冰点文库上搜索。
关于Shell编程的一些讨论
51testing上的Linux:
=================================================
关于变量操作
Q1:
不能进行变量赋值,不能得到自己想要的赋值结果,怎样把命令的结果赋给一个变量?
A:
可能你写错了shell语句,用了不适当的引号,请参考13问中引号与$()的讨论
这里要重点提醒大家区分三个字符`'"
如果大家的回帖中的结果和你的不一致,请仔细检查你输入这三个字符是不是和回帖一致
=================================================
__________________________________
=GNU/linux=
GNU{bash2.05b,grep2.5,Awk3.1.3,sed4.0.8}
=================================================
关于文本处理
edvisedawk都是常用的文本处理工具,如果你还不了解它们是什么,最好读一下下面两篇关于sed与awk的教程,这两篇是最基础的,但非常经典(请使用big5编码阅读,关于乱码的问题已经超出了讨论时限,那应该是十年前讨论的问题)
http:
//phi.sinica.edu.tw/aspac/reports/94/94011/
http:
//phi.sinica.edu.tw/aspac/reports/96/96005/
grep也是常用的文本处理工具,它用来查找文本中你想要或不想要的东西,它的基本用法在
文本处理中还有一门基本功是正则表达式,基础教程是
http:
//phi.sinica.edu.tw/aspac/reports/94/94019/
这篇教程请用big5码浏览
论坛中还有不错的讨论
...hlight=%D5%FD%D4%F2
Q1:
我使用了sed/awk,但文件没有改变
A:
是的,这是正常的,sed/awk的结果缺省情况下是送到标准输出的,而不是改变原文件,你可以将结果重定向到一个临时文件,然后用mv覆盖原文件,关于重定向请参考
...p;page=7#pid1636825
...5%26filter%3Ddigest
对于GNUsed3以上版本的用户,可以用-i参数直接修改原文件
Q2:
如何合并/对比两个文件,如何根据file1中的条件处理其它文件?
A:
paste/comm/diff是解决这种问题的好工具
...1%26filter%3Ddigest
...1%26filter%3Ddigest
这里还有一个处理这种问题强大工具:
awk,可以用一句话形容:
只有想不到的,没有办不到的
...1%26filter%3Ddigest
Q3:
为什么我使用回帖中的awk命令报错?
A:
有两个可能最大:
1.不够细心,仔细再对比一下与回帖有没有出入
2.因为你没使用GreatGNUawk,如果没有gawk可用,可以尝试一下有没有nawk
Q4:
如何在sed/awk中使用shell中的变量?
反之呢?
A:
1.关于awk使用shell变量的总结...&extra=page%3D1
2.利用shell作变量替换(具体原理看13问之qouting)
var=abcd
sed:
sed-n"/$var/p"//awk:
awk'/'"$var"'/'
num=2
sed:
sed-n"${n}p"//awk:
awk'NR=='"$var"''
#sed要用双引号,awk变量顺序单双$var双单
复制代码
反之:
sed/awk将变量传给shell可以用eval,如
eval$(awk'BEGIN{print"a=gggb=3"}')
然后
echo$a;echo$b
测试一下
复制代码
================================================
__________________________________
=GNU/linux=
GNU{bash2.05b,grep2.5,Awk3.1.3,sed4.0.8}
================================================
关于自动执行交互任务
Q1:
如果实现ftp,telnet?
A:
用管道或here文档可以解决
Q2:
为什么用管道或here文档的方法不能实现自动ssh,su与更改密码?
A:
这些程序需要从tty获得输入而不是标准输入,通用的解决办法是expect,下面是这个工具的教程
...mp;highlight=expect
...mp;highlight=expect
对于ssh,有另一种用用密钥对验证的方法
...1%26filter%3Ddigest
对于GNU/linux用户,passwd使用--stdin选项可以接受标准输入,具体请manpasswd
================================================
__________________________________
=GNU/linux=
GNU{bash2.05b,grep2.5,Awk3.1.3,sed4.0.8}
QUOTE:
================================================
关于时间处理
Q1:
如何取得某天前的时间?
A:
如何用date获得前一天的日期,忘了
如何显示昨天的日期?
一个关于时间转换的awk脚本
shell计算明天和昨天日期的函数
如何计算一个日期是星期几?
如何显示昨天的日期?
俺写了几个关于日期的小函数
================================================
另外几个计算日期的函数,非GNUShell可以看下(感谢Shell_HAT提供)
__________________________________
=GNU/linux=
GNU{bash2.05b,grep2.5,Awk3.1.3,sed4.0.8}
================================================
关于条件判断
Q1:
为什么我的条件判断会出错?
A:
是因为没遵循shell的语法
...6%26filter%3Ddigest
================================================
__________________________________
=GNU/linux=
GNU{bash2.05b,grep2.5,Awk3.1.3,sed4.0.8}
=========================================
关于crontab
Q1:
为何可以手工执行,加入crontab后却不能正确执行
A:
1.如果crontab执行失败,会发送email给你,请在mail中查找出错原因
2.crontab中的PATH变量设置与交互式shell环境中不同,要执行的命令必须有正确路径
3.在crontab中%字符被认为是换行,所以你的命令中有%时,在crontab中要加\转义
比如
30****date'+%D'>datefile
是错误的
正确的应该是
30****date'+\%D'>datefile
复制代码
==========================================
__________________________________
=GNU/linux=
GNU{bash2.05b,grep2.5,Awk3.1.3,sed4.0.8}
关于whileread只执行一次的问题
Q:
下面的代码为何只执行了一次就退出了?
seq10>file
whilereada
do
echo$a
dd&>/dev/null
done 复制代码 A: 因为重定向是针对整个while循环块的,而不只是read命令 请参看下面的链接 __________________________________ =GNU/linux= GNU{bash2.05b,grep2.5,Awk3.1.3,sed4.0.8} -------------------------------------------------------------------------------- 当你的文件操作,比如 awk'{print$1}'file得到逻辑上的第一个字段,print$2得到了第二个字段 而awk'{print$1,$2}'却得不到逻辑上的前2个字段,那么此时要注意你的文件类型了,很可能是非Linux下文件,cat-A看下是否正常。 一个常见的异常内容如下 20: 50: 07up55days,12: 56,3users,loadaverage: 0.03,0.08,0.14^M$(Linux正常的内容是$结尾的) 用dos2unix来转一下,这种问题很诡异而且隐蔽,遇到此类问题,不妨关注一下。 ps: 假如没dos2unix,可以sed,vim替换,这个^M如何打出来? 在终端上按住ctrl,同时再presssv和m2个键,就可以了。 1.Linux脚本编写基础 O%s8ntH(`3250101.1语法基本介绍51Testing软件测试网-h#LNP9v3? UR%[ 1.1.1开头 Awo;i: aBk325010 程序必须以下面的行开始(必须放在文件的第一行): r'pM9~vE325010 #! /bin/sh51Testing软件测试网f5O+a*w8aq&^f 符号#! 用来告诉系统它后面的参数是用来执行该文件的程序。 在这个例子中我们使用/bin/sh来执行程序。 当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 51Testing软件测试网&y+R%{&_&s 要使脚本可执行: 编译chmod+xfilename这样才能用./filename来运行51Testing软件测试网ror^wfMV 1.1.2注释 gj0]5WJP325010 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。 我们真诚地建议您在程序中使用注释。 如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。 6N3Dt$T9cz/TJ3250101.1.3变量51Testing软件测试网%U2Tyl#Ie*h^h 在其他编程语言中您必须使用变量。 在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。 要赋值给一个变量,您可以这样写: c2],k3uh325010 #! /bin/sh51Testing软件测试网XEm(BN^fvZ/quO #对变量赋值: s4ETURK1LVD325010 a="helloworld"51Testing软件测试网,WX4w~C7_qd,L_M&` #现在打印变量a的内容: &d^T9V3iv%J325010 echo"Ais: " 9]9? {y3nk325010 echo$a *Mi? y'zO325010 有时候变量名很容易与其他文字混淆,比如: 51Testing软件测试网;~HD9}JBG(N\%Y num=251Testing软件测试网Rw1j8u5In*n7`5] echo"thisisthe$numnd" ? 2z$MY%ix325010 这并不会打印出"thisisthe2nd",而仅仅打印"thisisthe",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。 可以使用花括号来告诉shell我们要打印的是num变量: z: tzm: T%D9_6S%j1q325010 num=2 SGVD? `^~325010 echo"thisisthe${num}nd" 3OCv$X;V[Q@325010 这将打印: thisisthe2nd .o{Llb! G3250101.1.4环境变量 ;lJW%laiTA! dK325010 由export关键字处理过的变量叫做环境变量。 我们不对环境变量进行讨论,因为通常情况下仅仅在登录 ni&U*v-V%e|325010脚本中使用环境变量。 51Testing软件测试网ph5_.a.|,N8rt*? 1.1.5Shell命令和流程控制 y8{J)}(V3g325010 在shell脚本中可以使用三类命令: psVT\*oEC325010 1)Unix命令: 51Testing软件测试网U(U[! h5N*{\ 虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。 这些命令通常是用来进行文件和文字操作的。 51Testing软件测试网)o? F0ZkY~"| 常用命令语法及功能51Testing软件测试网N(A6G3q%~z/P&B echo"sometext": 将文字内容打印在屏幕上51Testing软件测试网5[-A^ylZ ls: 文件列表 &I! uDVI_ap;d,n325010 wc–lfilewc-wfilewc-cfile: 计算文件行数计算文件中的单词数计算文件中的字符数51Testing软件测试网K2M`"LU-ZMe0@ cpsourcefiledestfile: 文件拷贝51Testing软件测试网g3u]]1Mp*s n mvoldnamenewname: 重命名文件或移动文件51Testing软件测试网PwzkL-sH rmfile: 删除文件51Testing软件测试网2mvyH4O8_r grep'pattern'file: 在文件内搜索字符串比如: grep'searchstring'file.txt51Testing软件测试网~/p{q5i]'~T\ cut-bcolnumfile: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如: 输出每行第5个到第9个字符cut-b5-9file.txt千万不要和cat命令混淆,这是两个完全不同的命令 : r'}@bo325010 catfile.txt: 输出文件内容到标准输出设备(屏幕)上 CP*];? 0mrm7w{325010 filesomefile: 得到文件类型 )L*JLl3x }c325010 readvar: 提示用户输入,并将输入赋值给变量 bV3xrp^]G/f325010 sortfile.txt: 对file.txt文件中的行进行排序51Testing软件测试网: N.@? h+cVW6M uniq: 删除文本文件中出现的行列比如: sortfile.txt|uniq &k7Cxz%CiEP325010 expr: 进行数学运算Example: add2and3expr2"+"351Testing软件测试网2GY{8z$x! E%b;R"t$h find: 搜索文件比如: 根据文件名搜索find.-namefilename-print m$KF)Yt.RNv'b325010 tee: 将数据输出到标准输出设备(屏幕)和文件比如: somecommand|teeoutfile51Testing软件测试网9uxZ+u.E? n(q basenamefile: 返回不包含路径的文件名比如: basename/bin/tux将返回tux 0o: }$l! uE: P'D#ht325010 dirnamefile: 返回文件所在路径比如: dirname/bin/tux将返回/bin51Testing软件测试网R}d2CK? e headfile: 打印文本文件开头几行51Testing软件测试网LY: G`)kw,q'E\` tailfile: 打印文本文件末尾几行51Testing软件测试网7UpHw\M\$_z sed: Sed是一个基本的查找替换程序。 可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。 该命令采用正则表达式(见参考)进行搜索。 不要和shell中的通配符相混淆。 比如: 将linuxfocus替换为LinuxFocus: cattext.file|sed's/linuxfocus/LinuxFocus/'>newtext.file51Testing软件测试网i8BU}T: i#xb4k awk: awk用来从文本文件中提取字段。 缺省地,字段分割符是空格,可以使用-F指定其他分割符。 C'GIR [@4UeL325010catfile.txt|awk-F,'{print$1","$3}'这里我们使用,作为字段分割符,同时打印第一个和第三个字段。 如果该文件内容如下: AdamBor,34,IndiaKerryMiller,22,USA51Testing软件测试网gI(R.ZS"P[2@ 命令输出结果为: AdamBor,IndiaKerryMiller,USA eE&zz4T1f325010 2)概念: 管道,重定向和backtick v? N! g5E#_[x325010 这些不是系统命令,但是他们真的很重要。 ? 6wU^;hz325010 管道(|)将一个命令的输出作为另外一个命令的输入。 nm? }*HGFKaC325010 grep"hello"file.txt|wc-l51Testing软件测试网: O(G)v_D'HD 在file.txt中搜索包含有”hello”的行并计算其行数。 51Testing软件测试网*\JRiC! M6w|N| 在这里grep命令的输出作为wc命令的输入。 当然您可以使用多个命令。 51Testing软件测试网8qC)^: gM8x 重定向: 将命令的结果输出到文件,而不是标准输出(屏幕)。 51Testing软件测试网7h{gw~ >写入文件并覆盖旧文件51Testing软件测试网S+[}YgQ1v >>加到文件的尾部,保留旧文件内容。 51Testing软件测试网8\B"h/A[2f6~k 反短斜线 3_[4u'`rr325010 使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。 $sUv$WU#~G325010 命令: U/H*? yN5w)Y&~325010 find.-mtime-1-typef-print pqQ{}E;Y325010 用来查找过去24小时(-mtime–2则表示过去48小时)内修改过的文件。 如果您想将所有查找到的文件打一个包,则可以使用以下脚本: 51Testing软件测试网N-GU,Z1vl #! /bin/sh n[7W8{(B"k6^^^325010 #Theticksarebackticks(`)notnormalquotes('): /{%[-jW+z'wP#|_325010 tar-zcvflastmod.tar.gz`find.-mtime-1-typef-print` *ZawO|r325010 3)流程控制 ~'Q6_V;gn8M3E325010 1.if51Testing软件测试网(k)kBS/`0N"V| "if"表达式如果条件为真则执行then后面的部分: Y Ti(o`c7G"_325010 if....;then d_3M*jF"X5h2q|? 325010 .... -m(l.]WN7CDGq;]v8I325010 elif....;then51Testing软件测试网? 8G^7BE.C V1I ....51Testing软件测试网! WXQ2nlaN: \ else +\Xwt1kwX325010 .... Z! h7XmMX$a325010 fi +B.mF#]1LvT2xk325
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 Shell 编程 一些 讨论