@zhengyuhong
2015-04-14T02:58:00.000000Z
字数 3058
阅读 1270
读书笔记 linux shell
当一个文件中开头的两个字符是"#!",内核会扫描改行的其余部分,看是否存在可用来执行脚本的解释器的完整路径。(中间如果有任何空白符号都会略过)
变量就是为某个信息片段所起的名字,所有语言都有变量,Shell也不例外。每一个变量有一个值,这是由用户分配给变量的内存或者信息。
变量赋值方式为:先写变量名称,紧接着=字符,最后是值。中间完全没有任何空格,当使用变量是,需要再变量名前面加上$美元符号,当所赋予的值含有空格时,加上引号。如:
n=5name="zheng yuhong"echo $name
以<改变标准输入
program < inputfile可以将program的标准输入修改为inpufile如
tr -d '\t' <input.txt
以>改变标准输出
tr -d '\r' <input.txt > output.txt
以>>附加到文件
以|建立管道
program1 | grogram2可将program1的标准输出修改为program2的标准输入
特殊文件
UNIX系统提供了两个队Shell编程特别有用的特殊文件,/devl/null,垃圾桶。另一个就是/dev/tty,当程序打开此文件时,UNIX会自动将它重定向到一个终端或者串口端口。这是程序必须读取人工输入时特别有用。
Shell会沿着查找路径$PATH来寻找命令,如果想把自定义的可执行文件加入PATH中,可以把自定义的可执行文件所在目录添加到PATH中即可。如果想要让其永久生效,在/etc/profile加入可执行文件所在目录即可。通常建议不要修改全局的profile,可以在用户的.bashrc中加入添加到PATH即可。
程序难免出错,想知道程序正在做什么,把执行跟踪功能打开。这样子会是的Shell显示每一个被执行到的命令
sh -x tset.sh
grep -E使用扩展正则表达式匹配 -v显示不匹配的行
stream edit流编辑器,在Shell中,sed主要用于一些简单的文本替换。替换文本操作方法是使用s命令-要求正则表达式寻找,用替代文本替换匹配文本,如下:
sed 's/regex//replacement' inputsed 's/:.*//' /etc/passwd #删除第一个冒号之和所有东西(包括冒号)
在上面,/字符扮演定界符(delimiter)的角色,从而分隔正则表达式与替代文本,在上例中,替换文本是空的。虽然/是最常用的定界符,但是任何可现实的字符都可以作为定界符。在处理文件名称时,通常会以标点符号字符作为定界符(例如分好、冒号或者逗号):
如
echo $PATH | sed 's;/home/zhengyuyhong/;/home/zhengyuhong'
可以看到,由于目录含有反斜杠,所以不能用反斜杠作为定界符,定界符就是s后面的字符,简单直接,所以可以使用任何字符来作为定界符。
到目前为止,我们讲的都是一次替换一个。虽然可以将多个sed实体以管道方式穿起来,但是给予sed多个命令更加容易。在命令行上,可以通过选择 -e完成。如:
sed -e 's/foo/bar/g' -e 's/child/children/g' input.xml > output.xml
不过,如果有多个要编辑项目,这种形式长,所以将编辑命令全放在脚本中更好,再使用sed -f搭配即可。
cat fixup.seds/foo/bar/gs/child/children/gs/iphone/iPhone/gsed -f fixup.sed input.xml > output.xml
sed的工作方式相当直接,命令行上的每一个文件会依次打开与读取。sed读取每个文件,依次读取一行,将读取的行放在内存的一个区域,然后再编辑命令下修改,然后打印到标准输出
cur命令是用来剪下文本文件里的数据,文本文件可以是字段类型或是字符类型。举例来说:
cut -d : -f 1,5 /etc/passwd #以冒号为分隔符,提取第1字段、第5字段cut -d : -f 1-5 /etc/passwd #以冒号为分隔符,提取第1至第5字段cut -d : -f 1,7-10 /etc/passwd #以冒号为分隔符,提取第1字段和第7至第10字段
join可以将多个文件结合在一起:
join -1 field1 -2 field2 -t separator
awk -F"\t" '{print $1,$5}' /etc/passwd #指定分隔符,打印第一字段、第五字段awk -F: -v 'OFS=**' '{print $1,$5}' /etc/passwd# 指定输出分隔符为**
使用-k选项指定排序字段,并且用-t指定定界分隔符,如果未指定-t,则表示使用空白分隔符作为定界符。
-k后面接一个字段编号或者一对字段编号,-k2表示使用第2(包括第2字段)以后的字段作为排序键,-k2,4,表示使用第2到第4的字段作为排序键。
-n表示排序键作为数字类型排序
-r输出反序(默认为升序)
readonly,它可以使变量成为只读模式,赋值给它们是禁止的。在Shell程序中,这是创建符号常量的一个好方法
export,将变量放入环境里,例如
PATH=$PATH:/home/bin
新PATH生效的范围仅能在当前shell进程当中,在shell的子进程、父进程就不可行。
export PATH=$PATH:/home/bin则在整个环境生效,在所有shell进程中均生效。
| 运算符 | 替换 |
|---|---|
| ${varname:-word} | 如果varname存在且非null,则返回其值,否则返回word |
| ${varname:=word} | 如果varname存在且非null,则返回其值,对varname赋值为word,并返回word |
| 运算符 | 如果左侧为真 |
|---|---|
| [ -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 |
也可以使用前置!作否定
在执行shift之后,
file=verbose=quiet=long=while [ $# -gt 0 ]docase $1 in-f) file=$2shift;;-v) verbose=turequiet=;;-q) quiet=tureverbose=;;-l) long=true;;--) shiftbreak;;-*) echo $0:$1:unrecognized option >&2;;breakesacshiftdone
