[关闭]
@zhengyuhong 2015-04-14T02:58:00.000000Z 字数 3058 阅读 1270

Shell脚本学习指南

读书笔记 linux shell


2、入门

  当一个文件中开头的两个字符是"#!",内核会扫描改行的其余部分,看是否存在可用来执行脚本的解释器的完整路径。(中间如果有任何空白符号都会略过)

2.5.2、变量

  变量就是为某个信息片段所起的名字,所有语言都有变量,Shell也不例外。每一个变量有一个值,这是由用户分配给变量的内存或者信息。
  变量赋值方式为:先写变量名称,紧接着=字符,最后是值。中间完全没有任何空格,当使用变量是,需要再变量名前面加上$美元符号,当所赋予的值含有空格时,加上引号。如:

  1. n=5
  2. name="zheng yuhong"
  3. echo $name

2.5.5、重定向与管道

以<改变标准输入
  program < inputfile可以将program的标准输入修改为inpufile如

  1. tr -d '\t' <input.txt

以>改变标准输出

  1. tr -d '\r' <input.txt > output.txt

以>>附加到文件
以|建立管道
  program1 | grogram2可将program1的标准输出修改为program2的标准输入

特殊文件
  UNIX系统提供了两个队Shell编程特别有用的特殊文件,/devl/null,垃圾桶。另一个就是/dev/tty,当程序打开此文件时,UNIX会自动将它重定向到一个终端或者串口端口。这是程序必须读取人工输入时特别有用。

2.5.6、基本命令查找

  Shell会沿着查找路径$PATH来寻找命令,如果想把自定义的可执行文件加入PATH中,可以把自定义的可执行文件所在目录添加到PATH中即可。如果想要让其永久生效,在/etc/profile加入可执行文件所在目录即可。通常建议不要修改全局的profile,可以在用户的.bashrc中加入添加到PATH即可。

2.7、简单的执行跟踪

  程序难免出错,想知道程序正在做什么,把执行跟踪功能打开。这样子会是的Shell显示每一个被执行到的命令

  1. sh -x tset.sh

3、查找与替换

3.1、查找文本

  grep -E使用扩展正则表达式匹配 -v显示不匹配的行

3.2.6、sed

  stream edit流编辑器,在Shell中,sed主要用于一些简单的文本替换。替换文本操作方法是使用s命令-要求正则表达式寻找,用替代文本替换匹配文本,如下:

  1. sed 's/regex//replacement' input
  2. sed 's/:.*//' /etc/passwd #删除第一个冒号之和所有东西(包括冒号)

  在上面,/字符扮演定界符(delimiter)的角色,从而分隔正则表达式与替代文本,在上例中,替换文本是空的。虽然/是最常用的定界符,但是任何可现实的字符都可以作为定界符。在处理文件名称时,通常会以标点符号字符作为定界符(例如分好、冒号或者逗号):
  如

  1. echo $PATH | sed 's;/home/zhengyuyhong/;/home/zhengyuhong'

  可以看到,由于目录含有反斜杠,所以不能用反斜杠作为定界符,定界符就是s后面的字符,简单直接,所以可以使用任何字符来作为定界符。
  到目前为止,我们讲的都是一次替换一个。虽然可以将多个sed实体以管道方式穿起来,但是给予sed多个命令更加容易。在命令行上,可以通过选择 -e完成。如:

  1. sed -e 's/foo/bar/g' -e 's/child/children/g' input.xml > output.xml

  不过,如果有多个要编辑项目,这种形式长,所以将编辑命令全放在脚本中更好,再使用sed -f搭配即可。

  1. cat fixup.sed
  2. s/foo/bar/g
  3. s/child/children/g
  4. s/iphone/iPhone/g
  5. sed -f fixup.sed input.xml > output.xml

3.2.8、sed的运作

  sed的工作方式相当直接,命令行上的每一个文件会依次打开与读取。sed读取每个文件,依次读取一行,将读取的行放在内存的一个区域,然后再编辑命令下修改,然后打印到标准输出

3.3.2、使用cut选定字段

  cur命令是用来剪下文本文件里的数据,文本文件可以是字段类型或是字符类型。举例来说:

  1. cut -d : -f 1,5 /etc/passwd #以冒号为分隔符,提取第1字段、第5字段
  2. cut -d : -f 1-5 /etc/passwd #以冒号为分隔符,提取第1至第5字段
  3. cut -d : -f 17-10 /etc/passwd #以冒号为分隔符,提取第1字段和第7至第10字段

3.3.3、使用join连接字段

  join可以将多个文件结合在一起:
  join -1 field1 -2 field2 -t separator

3.3.4、awk

  1. awk -F"\t" '{print $1,$5}' /etc/passwd #指定分隔符,打印第一字段、第五字段
  2. awk -F: -v 'OFS=**' '{print $1,$5}' /etc/passwd# 指定输出分隔符为**

文本处理工具

4.1.2、以字段排序

  使用-k选项指定排序字段,并且用-t指定定界分隔符,如果未指定-t,则表示使用空白分隔符作为定界符。
  -k后面接一个字段编号或者一对字段编号,-k2表示使用第2(包括第2字段)以后的字段作为排序键,-k2,4,表示使用第2到第4的字段作为排序键。
  -n表示排序键作为数字类型排序
  -r输出反序(默认为升序)

变量、判断、重复动作

6.1.1、变量赋值与环境

readonly,它可以使变量成为只读模式,赋值给它们是禁止的。在Shell程序中,这是创建符号常量的一个好方法
export,将变量放入环境里,例如

  1. PATH=$PATH:/home/bin

新PATH生效的范围仅能在当前shell进程当中,在shell的子进程、父进程就不可行。

  1. export PATH=$PATH:/home/bin
  2. 则在整个环境生效,在所有shell进程中均生效。

6.1.2、参数展开

运算符 替换
${varname:-word} 如果varname存在且非null,则返回其值,否则返回word
${varname:=word} 如果varname存在且非null,则返回其值,对varname赋值为word,并返回word

6.2.4、test命令

运算符 如果左侧为真
[ -f file ] file为一般文件
[ -n string ] string非空
[ -z string ] string为空
[ -r file ] file可读
[ -w file ] file可写
[ s1 = s2 ] 字符串s1与字符串s2相同
[ s1 != s2 ] 字符串s1与字符串s2不同
[ n1 -eq n2 ] 整型n1与整型n2相等
[ n1 -ne n2 ] 整型n1与整型n2不等
[ n1 -lt n2 ] 整型n1小于整型n2
[ n1 -gt n2 ] 整型n1大于整型n2
[ n1 -le n2 ] 整型n1小于或者等于整型n2
[ n1 -ge n2 ] 整型n1大于或者等于整型n2

也可以使用前置!作否定

6.4.4、shift与选项的处理

  在执行shift之后,12的旧值取代,以此类推。shift还可以接受一个可选参数,就是一次移动的位数。默认为1

  1. file=
  2. verbose=
  3. quiet=
  4. long=
  5. while [ $# -gt 0 ]
  6. do
  7. case $1 in
  8. -f) file=$2
  9. shift
  10. ;;
  11. -v) verbose=ture
  12. quiet=
  13. ;;
  14. -q) quiet=ture
  15. verbose=
  16. ;;
  17. -l) long=true
  18. ;;
  19. --) shift
  20. break
  21. ;;
  22. -*) echo $0:$1:unrecognized option >&2
  23. ;;
  24. break
  25. esac
  26. shift
  27. done
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注