设为首页 收藏本站
查看: 1136|回复: 0

shell脚本编程知识汇总(一)

[复制链接]

尚未签到

发表于 2018-8-30 09:29:10 | 显示全部楼层 |阅读模式

原文:
http://www.cnblogs.com/ebusi/archive/2011/02/09/1950422.html
Shell脚本编程的常识
  (这些往往是经常用到,但是各种网络上的材料都语焉不详的东西,个人认为比较有用)
七种文件类型
  d            目录                                                       l             符号链接
  s             套接字文件                                           b            块设备文件
  c            字符设备文件                                       p            命名管道文件
  -             普通文件
正则表达式
  从一个文件或命令输出中抽取或过滤文本时。可使用正则表达式(RE),正则表达式是一些特殊或不很特殊的字符串模式的集合。
  基本的元字符集:
  ^                   只匹配行首。
  $                   只匹配行尾。
  *                   一个单字符后紧跟*,匹配0个或多个此单字符。
  []                   匹配[]内字符,可以是一个单字符,也可以是字符序列。可以使
  用-来表示[]内范围,如[1-5]等价于[1,2,3,4,5]。
  \\                    屏蔽一个元字符的特殊含义,如\\$表示字符$,而不表示匹配行
  尾。
  .                 匹配任意单字符。
  pattern\\{n\\}   匹配pattern出现的次数n
  pattern\\{n,\\}m匹配pattern出现的次数,但表示次数最少为n
  pattern\\{n,m\\} 匹配pattern出现的次数在n与m之间(n,m为0-255)
  几个常见的例子:
  显示可执行的文件:ls –l | grep …x...x..x
  只显示文件夹:ls –l | grep  ^d
  匹配所有的空行:^$
  匹配所有的单词:[A-Z a-z]*
  匹配任一非字母型字符:[^A-Z a-z]
  包含八个字符的行:^……..$(8个.)
字符类描述
  以下是可用字符类的相当完整的列表:
  [:alnum:] 字母数字 [a-z A-Z 0-9]
  [:alpha:] 字母 [a-z A-Z]
  [:blank:] 空格或制表键
  [:cntrl:] 任何控制字符
  [:digit:] 数字 [0-9]
  [:graph:] 任何可视字符(无空格)
  [:lower:] 小写 [a-z]
  [:print:] 非控制字符
  [:punct:] 标点字符
  [:space:] 空格
  [:upper:] 大写 [A-Z]
  [:xdigit:] 十六进制数字 [0-9 a-f A-F]
  尽可能使用字符类是很有利的,因为它们可以更好地适应非英语 locale(包括某些必需的重音字符等等).
shell的引号类型
  shell共有四种引用类型:
  “ ”          双引号
  ‘ ’           单引号
  ` `         反引号
  \\            反斜线
  l        “ ” 可引用除$、` 、\\ 、外的任意字符或字符串,“ ”中的变量能够正常显示变量值。
  l        ‘ ’与“ ”类似,不同在于shell会忽略任何的引用值。
  例如: GIRL=‘girl’
  echo “The ‘$GIRL’ did well”
  则打印:The ‘girl’ did well
  l        ` `用于设置系统命令的输出到变量,shell会将` `中的内容作为一个系统命令并执行质。
  例如:echo `date` 则打印当前的系统时间。
  l        \\ 用来屏蔽特殊含义的字符:&  *  +  ^  $  `  “  |  ?
  例如:expr 12 \\* 12 将输出144
变量设置时的不同模式:
  valiable_name=value           设置实际值到 variable_name中
  valiable_name+value           如果设置了variable_name,则重设其值
  valiable_name:?value           如果未设置variable_name,则先显示未定义用户错误信息
  valiable_name?value           如果未设置variable_name,则显示系统错误信息
  valiable_name:=value   如果未设置variable_name,则设置其值
  valiable_name-value            同上,但取值并不设置到variable_name
条件测试
  test命令用于测试字符串、文件状态和数字,expr测试和执行数值输出。
  Test格式:test condition 或 [ condition ](需要特别注意的是condition的两边都要有一个空格,否则会报错),test命令返回0表示成功。
  l        下面将分别描述test的三种测试:
  n        文件状态测试(常用的)
  -d           测试是否文件夹
  -f            测试是否一般文件
  -L          测试是否链接文件
  -r           测试文件是否可读
  -w         测试文件是否可写
  -x           测试文件是否可执行
  -s           测试文件是否非空
  n        字符串测试
  五种格式: test  “string”
  test  string_operator  “string”
  test  “string”  string_operator  “string”
  [ string_operator  “string” ]
  [ “string”  string_operator  “string” ]
  其中string_operator可以为:       =     两字符串相等
  !=    两字符串不等
  -z   空串
  -n   非空串
  n        数值测试
  两种格式: “number”  number_operator  “number”
  [ “number”  number_operator  “number” ]
  其中:number_operator 可以为:-eq  、-ne、-gt、-lt、-ge
  例如:  NUMBER=130
  [ “990”  –le  “995”  –a  “NUMBER”  -gt  “133” ]
  (其中-a表示前后结果相“与”)
  l        expr命令一般用于整数值,但也可以用于字符串。
  n        格式:  expr srgument operator operator argument
  例如:  expr 10 + 10
  expr 10 ^ 2 (10的平方)
  expr $value + 10
  n        增量计数――expr在循环中最基本的用法
  例如:  LOOP=0
  LOOP=`expr $LOOP + 1`
  n        模式匹配:通过指定的冒号选项计算字符串中的字符数
  例如:  value=account.doc
  expr $value : `\\(.*\\).doc`
  输出 account
命令执行顺序
  &&               成功执行一个命令后再执行下一个
  ||                    一个命令执行失败后再执行另一个命令
  ( )                  在当前shell中执行一组命令(格式:(命令1;命令2; ……))
  { }                同( )
  例如:  comet mouth_end || ( echo “hello” | mail dave ;exit )
  如果没有( ),则shell将直接执行最后一个命令(exit)
脚本调试
  最有用的调试脚本的工具是echo命令,可以随时打印有关变量或操作的信息,以帮助定位错误。也可使用打印最后状态($?) 命令来判断命令是否成功,这时要注意的是要在执行完要测试的命令后立即输出$?,否则$?将会改变。
  Set命令也可以用来辅助脚本测试:
  Set –n           读命令但是不执行
  Set –v           显示读取的所有的行
  Set –x           显示所有的命令及其参数
  (要关闭set选项,只要把-换成+就可以了,这里有点特殊,要注意一下)
一些常用的小trick
打印一些头信息
  command   100) { print "We are on record number 1-9 or 101+" }
  另一个示例:
  {
  #skip header
  if ( NR > 10 ) {
  print "ok, now for the real information!"
  }
  }
  awk 提供了适合各种用途的附加变量。我们将在以后的文章中讨论这些变量。
多行记录
  awk 是一种用于读取和处理结构化数据(如系统的 /etc/passwd 文件)的极佳工具。/etc/passwd 是 UNIX 用户数据库,并且是用冒号定界的文本文件,它包含许多重要信息,包括所有现有用户帐户和用户标识,以及其它信息。在我的前一篇文章中,我演示了 awk 如何轻松地分析这个文件。我们只须将 FS(字段分隔符)变量设置成 ":"。
  正确设置了 FS 变量之后,就可以将 awk 配置成分析几乎任何类型的结构化数据,只要这些数据是每行一个记录。然而,如果要分析占据多行的记录,仅仅依靠设置 FS 是不够的。在这些情况下,我们还需要修改 RS 记录分隔符变量。RS 变量告诉 awk 当前记录什么时候结束,新记录什么时候开始。
  譬如,让我们讨论一下如何完成处理“联邦证人保护计划”所涉及人员的地址列表的任务:
  Jimmy the Weasel
  100 Pleasant Drive
  San Francisco, CA 12345
  Big Tony
  200 Incognito Ave.
  Suburbia, WA 67890
  理论上,我们希望 awk 将每 3 行看作是一个独立的记录,而不是三个独立的记录。如果 awk 将地址的第一行看作是第一个字段 ($1),街道地址看作是第二个字段 ($2),城市、州和邮政编码看作是第三个字段 $3,那么这个代码就会变得很简单。以下就是我们想要得到的代码:
  BEGIN {
  FS="\\n"
  RS=""
  }
  在上面这段代码中,将 FS 设置成 "\\n" 告诉 awk 每个字段都占据一行。通过将 RS 设置成 "",还会告诉 awk 每个地址记录都由空白行分隔。一旦 awk 知道是如何格式化输入的,它就可以为我们执行所有分析工作,脚本的其余部分很简单。让我们研究一个完整的脚本,它将分析这个地址列表,并将每个记录打印在一行上,用逗号分隔每个字段。
  address.awk BEGIN {
  FS="\\n"
  RS=""
  }
  {
  print $1 ", " $2 ", " $3
  }
  如果这个脚本保存为 address.awk,地址数据存储在文件 address.txt 中,可以通过输入 "awk -f address.awk address.txt" 来执行这个脚本。此代码将产生以下输出:
  Jimmy the Weasel, 100 Pleasant Drive, San Francisco, CA 12345
  Big Tony, 200 Incognito Ave., Suburbia, WA 67890
OFS 和 ORS
  在 address.awk 的 print 语句中,可以看到 awk 会连接(合并)一行中彼此相邻的字符串。我们使用此功能在同一行上的三个字段之间插入一个逗号和空格 (", ")。这个方法虽然有用,但比较难看。与其在字段间插入 ", " 字符串,倒不如让通过设置一个特殊 awk 变量 OFS,让 awk 完成这件事。请参考下面这个代码片断。
  print "Hello", "there", "Jim!"
  这行代码中的逗号并不是实际文字字符串的一部分。事实上,它们告诉 awk "Hello"、"there" 和 "Jim!" 是单独的字段,并且应该在每个字符串之间打印 OFS 变量。缺省情况下,awk 产生以下输出:
  Hello there Jim!
  这是缺省情况下的输出结果,OFS 被设置成 " ",单个空格。不过,我们可以方便地重新定义 OFS,这样 awk 将插入我们中意的字段分隔符。以下是原始 address.awk 程序的修订版,它使用 OFS 来输出那些中间的 ", " 字符串:
  address.awk 的修订版 BEGIN {
  FS="\\n"
  RS=""
  OFS=", "
  }
  {
  print $1, $2, $3
  }
  awk 还有一个特殊变量 ORS,全称是“输出记录分隔符”。通过设置缺省为换行 ("\\n") 的 OFS,我们可以控制在 print 语句结尾自动打印的字符。缺省 ORS 值会使 awk 在新行中输出每个新的 print 语句。如果想使输出的间隔翻倍,可以将 ORS 设置成 "\\n\\n"。或者,如果想要用单个空格分隔记录(而不换行),将 ORS 设置成 " "。
将多行转换成用 tab 分隔的格式
  假设我们编写了一个脚本,它将地址列表转换成每个记录一行,且用 tab 定界的格式,以便导入电子表格。使用稍加修改的 address.awk 之后,就可以清楚地看到这个程序只适合于三行的地址。如果 awk 遇到以下地址,将丢掉第四行,并且不打印该行:
  Cousin Vinnie
  Vinnie's Auto Shop
  300 City Alley
  Sosueme, OR 76543
  要处理这种情况,代码最好考虑每个字段的记录数量,并依次打印每个记录。现在,代码只打印地址的前三个字段。以下就是我们想要的一些代码:
  适合具有任意多字段的地址的 address.awk 版本 BEGIN {
  FS="\\n"
  RS=""
  ORS=""
  }
  {
  x=1
  while ( x

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-558746-1-1.html 上篇帖子: 跨站平台XSS SHELL使用方法 下篇帖子: shell脚本编程知识汇总(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表