1.默认使用 #!/bin/bash。
2.echo“hello”、echo ‘hello’和echo hello都可以打印hello,但是双引号不能打印!,只能放在双引号外面,或使用\转义。单引号不能打印变量值$var,会被原样输出。
3.printf格式化输出
4.获取pid:
ps –u root | grep filename 或pgrep filename
5.查看进程环境变量:
cat /proc/(进程pid)/environ
6.添加自定义环境变量/home/user/bin的方法:
Export PATH=”$PATH:/home/user/bin”
Shell自动在PATH环境变量所包含的目录列表中查找可执行文件
7.查看当前shell:
echo $SHELL
8.重定向问题:如 ls + 是一个错误命令
如果 ls + > out.txt,错误仍会输出到终端,因为我们重定向的是stdout;
如果 ls + 2>out.txt,错误就会输出到文件中了。
2>/dev/null,消除所有错误输出。
2>&1,stderr重定向到stdout的输出位置。
9.重定向脚本内部文本块:
10.文件打开方式有三种:只读、截断、追加。
exec 3<input.txt,使用fd为3打开并读取文件,这样以后在查看文件时可以用cat <&3。
而再次读取就不能用3了,需要重新分配描述符。
同样的,写文件和追加文件分别为:exec 4>output.txt和exec 5>>input.txt。
注意:exec的作用就是给文件指定相应操作的fd,且只能用一次。
11.数组的定义和打印:
array = {1 2 3 4 5},定义。
echo ${array[0]},打印一个。
echo ${array[*]},打印全部。
Echo ${#array[*]},打印个数。
Array={[index1]=val1 [index2]=val2},定义索引
Echo ${!array[*]},列出索引
12.别名:
Alias install=’sudo apt-get install’,起别名。
注意别名是临时的,当关闭终端就没了,所以为了一直存在,要存在~/.bashrc中,因为每个新的shell启动时都会执行~/.bashrc中的命令。
于是有:alias install=’sudo apt-get install’ >> ~/.bashrc
要删除将其在~/.bashrc中的语句删除或用unalias即可。
13.获取终端信息(tput和stty)
Tput cols或tput lines,获取列数和行数
Stty例子如下:
14.获取、设置时间和日期
Date,获取时间和日期。
Date +%s,获取纪元时,即从1970/1/1 0:0:0到现在的秒数,这个很有用,可以用来做时间戳。
15.调试脚本:
Bash –x script.h,启动调试。
将 #!/bin/bash替换为 #!/bin/bash –xv可以直接使用调试版本启动。
16.函数:
Fname() {echo $1; return0;},定义函数
Fork炸弹:
由于shell的函数可以递归调用,最后可能会死循环,可以通过修改配置文件/etc/security/limits.conf来限制可生成的进程数避免。
17.shell中()可以生成一个子shell,是独立的进程。
18.read命令可以从键盘或stdin中读取文本。
-n 指定个数,-t 指定时间, -d 指定结束符
19.字符串比较时最好用双括号,单括号容易发生错误。使用test可以避免过多的使用双括号。
20.script和scriptreplay命令可以录制终端会话/播放命令序列
在两个终端上实现实时播放:
终端1上输入mkfifo myfifo,终端2上输入cat myfifo,终端1再输入script –f myfifo。
这样终端1输入的任何命令都可以在终端2上实时播放了。
常用命令:
cat、find、locate、md5sum、sort、uniq。
uniq用于消除重复内容,只对已经排序的有效,经常和sort一起使用:
Sort unsorted.txt | uniq,消除重复行
Sort unsorted.txt | uniq -d,显示重复行