《The Linux Command Line》读书笔记
2012-07-28
本读书笔记原文在:
http://smilejay.com/2012/07/the-linux-command-line/
#copy abc_1.txt as abc_2.txt, abc_3.txt…
seq 2 9 | xargs -I ‘{}’ cp abc_1.txt abc_{}.txt
aspell check vim-temp.txt 做拼写检查
格式化输出的几个命令:
nl: number lines; folder -w 80 test.txt; fmt: simple text formatter; pr;
printf: format and print data.
格式化文档编辑系统 nroff, troff, TEX groff
打印文件:pr, lpr
ftp基本命令:ftp; open ftp.gnu.org; ls; cd gnu/indiction; get **.tar.gz; bye
本地变量:local 修饰的 其作用域在函数内
test命令:test expr or [ expr ] 是符合POSIX原则的
[[ expr ] 是对test的增强版,增加了字符串的正则表达式和匹配(=~操作符),且其中的==操作符实现了路径名的扩展。 非POSIX标准
(( expr )) 专门为整数设计的表达式。 非POSIX标准
pipeline starts a new subprocess. 管道开启了一个新的子进程。
here document or here script的语法如下:
command << token
text here
token
其作用是将文本的主题输入重定向到命令的标准输入,是一中I/O redirection方法。
而,here string(<<<)的作用类似于here document,只不过它只对单一的字符创来处理,使用here string的一个实例如下:
IFS=":" read user pw uid gid name home shell <<< "$password_info"
set -x # turn on tracing set +x #turn off tracing
set -x 前面增加的标识符,是$PS4 可以设置为PS4=’$LINENO + ‘ 即可输出行行数,还可以输出调用行函数(参见我们测试用到XVS系统代码)
参数的扩展:在容易混淆时,尽量使用${var}这样的形式。
${var:-value1} 在变量var不为空时,保持var原有的值不变;如果var变量未设置或者为空,这表达式结果为value1,但是变量var的值并不改变(未设置或为空)。
${var:+value1} 在变量var不为空时,表达式结果为value1;如果var变量未设置或者为空,这表达式结果为空。${var+value1}的效果一样。
${var:=value1} 在变量var不为空时,保持var原有的值不变;如果var变量未设置或者为空,这表达式结果为value1,变量var也被赋值为value1。
${var:?value1} 在变量var未设置或为空时,脚本会退出并抛出一个错误信息(包含value1)。
返回变量名的扩展:${!prefix*} ${!prefix@}
{#var} 返回$var变量表示的字符串长度,如果var为*或者@符号,它会返回位置参数的个数。
{#var:offset} {#var:offset:len} 如果len为空,则返回var中从offset开始到最后一个字符;如果len已经设定,这返回len个长度的字符;若offset为负数,则从最后开始往前计算offset。
${parameter/pattern/string}
${parameter//pattern/string}
${parameter/#pattern/string}
${parameter/%pattern/string}
This expansion performs a search and replace upon the contents of parameter. If text is found matching wildcard pattern, it is replaced with the contents of string. In the normal form, only the first occurrence of pattern is replaced. In the // form, all occurrences are replaced. The /# form requires that the match occur at the beginning of the string, and the /% form requires the match to occur at the end of the string. /string may be omitted, which causes the text matched by pattern to be deleted.
算术求值: $((expr))
支持各种进制的整数base#number e.g. echo $((2#11101101))
支持正负号 (+,-)
简单算术运算符:+, -, *, /, **, % (**是求幂, %是求模)
Shell的算术运算都是对整数进行的。
在算术求值表达式中,也可以进行赋值操作,支持如下的操作: $(( expr )) 为如下情况
var = value
var += value var -= value *= /= %=
var++ var-- ++var --var
位运算:
~ 按位取反; & 按位与; | 按位或; ^ 按位异或; << 向左移位; >> 向右移位
逻辑运算:
>, <, ==, >=, <=, !=, &&, ||, expr1?expr2:expr3
可以使用bc工具来做人任意精度的计算:(当然也可以使用awk, perl中处理浮点型计算)
bc接收类似C语言的文件作为输入来计算。
echo 'a=22;b=a+3; print a; print "n"; print b; print "n" ' | bc
echo "1.9999999-0.22222222222222222222222" | bc
bc <<< "1.9999999-0.22222222222222222222222"
bc foo.bc
bc #交互式操作; quit命令可以退出bc
Bash仅支持一维数组:
a[0]=0; #定义并赋值
declare -a a; #创建一个数组a
数组的赋值方式:
1. a[index]=value #单一赋值
2. a=(value1 value2 …) #同时多个赋值
输出数组的每个元素,可以用到*和@
for i in “${a[@]}”; do echo $i; done
获取数组元素的个数:echo ${#a[@]}
获取某个元素中的字符个数:echo ${#a[i]} #i=0,1,2,…
列出数组所用到的下标值:${!a[*]} ${!a[@]}
在数组末尾添加元素,用+= e.g. foo+=(d e f)
删除数组:unset foo 也可以删除某个数组元素:unset foo[2]
没有下边的数组名仅表示小标为0的元素:foo foo[0]
执行一组命令:1. 命令组 { com1; com2; … } 2. 子Shell (com1; com2; …)
它的好处是可以处理输出重定向和管道。
为了解决子Shell中的变量不能在原Shell中使用的问题,就产生了进程替换process substitution。
<(list) #针对产生标准输出的进程list
>(list) #针对产生标准输入的进程list
trap arg signal [signal…] #当进程接收到某些信号(signal)时进程执行arg中的操作
e.g. trap “echo ‘I’m ignoring you.’” SIGINT SIGTERM
异步执行: wait pid #等待PID为pid的进程执行完成
有名管道:
创建mkfifo pipe1 #创建了名为pipe1的有名管道, ls -l 可以看到它的类型是p
process1 > pipe1 #进程1会阻塞,直到进程2读取了pipe1中的数据
process2 < pipe1
有名管道看起来像普通文件一样,但它实际是一个FIFO的buffer