shell是对用户提出的运行程序的请求,进行解释的程序。
一、命令行的结构:命令的分隔符有分号( ; )、回车符(命令结束)、&(后台执行)等。用回车执行命令。
1. who命令:查看当前的系统用户信息。
2. date;who | wc 与(date;who)| wc
3. 管道线命令: | 。将一种命令的输出作为另一种命令的输入。而管道 | 的优先级要高于分隔符;的优先级。
4. tee命令:可以通过截获管道线上数据流并放进某个文件中。tee不是shell的一部分,但它有助于对管道操作。 用途之一:将中间结果保存在一个文件中:
eg:$(date;who) | tee user_online_file | wc
$cat user_online_file
$wc < user_online_file
功能:tee能将流经管道数据保存,对管道来说好像其不存在似的。
5. 输入输出重定向:应用程序运行时,默认打开3个文件,标准输入(stdin 0 键盘)、标准输入(stdout 1显示终端)、标准错误输出(stderr 2 显示终端)。
输入重定向:
使应用程序的输入不使用标准输入,而是用文件的内容。即将输入重定向到从文件输入。
重定向输入符: <
eg: $wc < user_online_file
输出重定向:
将程序的输出重定向到文件而不是标准输出。重定向输出符: >
eg: $who > user_online_file
与重定向输入输出<、>相似的两个符号:<< 、>>.前者用于here document的情形;后者将输出追加到文件。
6. 命令的结束符: & 、; 、\n 。&放在命令的后面,命令将在后台执行。用户可以接着与shell交互。
用fg、bg;分别命令应用程序放在前台,或后台执行,ctrl-z也有类似功能。(foreground、background)
eg:$(sleep 5; date) & date #5秒间隔,不一定准确
eg: $(sleep 600; echo tea is ok now!) & #定时提醒功能
&的优先级优于 ; 而 | 的优先级优于 &. 不确定时,最好用()。
7. pr命令: 打印文档。
eg: $ cat file | pr
8. shell解释的多种特殊字符, 如:< 、>、 |、 ;、 & 等 不能用于shell中的程序的参数。
eg:$ echo helloworld > junk
$>junk echo hello
二、元字符。
shell中有特殊意义的字符称之为元字符,使用元字符的普通意义,需要转义。
1. 元字符:*.
eg: $ echo * #功能和ls大致一样。
eg:$echo x*y #首先在当前目录查找以x开头以y结尾的文件,若无文件,则作为echo的参数
wzb55@ubuntu:~$ echo x*y
x*y
wzb55@ubuntu:~$ touch xxy
wzb55@ubuntu:~$ echo x*y
xxy
wzb55@ubuntu:~$
2. >: prog>file 输出重定向到file。
3. >>: prog>>file 将prog的输出追加到file中。
4. <: prog<file 从file中读取prog的输入。
5. | : 管道(pipe) p1 | p2 将p1的输出作为p2的输入。
6. <<串:here document:将标准输入读入到here documnet,直至遇到 串 结束。
7. *: 匹配文件名中任意多个字符,即0个或多个字符。
8. ?:匹配文件名中单个字符。
9. {CCC} : 匹配文件名中CCC范围内的字符, 0-9, a-z,即字符集。
10. ;: 命令结束符, p1; p2 : 先执行p1,再执行p2.
11. &: 命令结束符,指示命令后台运行。
12. `...`: 运行...中的命令,用其输出代替其出现的位置。
13. (...) : 在子shell中运行...中的命令。
14. {...} : 在当前shell中运行...中的命令。
15. $1 - $9: 代表shell文件的参数。
16. $0: 代表shell文件名。
17.$变量: shell变量的值。
18.${变量}: shell变量的值,避免变量与文本链接的混淆。
19. \C: \C将C字符作为普通字符使用。
20. '...' : 表示文字...。
21. "..." : 在...中$, `...`、和\得到解释后,将...作为文本文字。
22. # :表示行注释的开始。
23. 变量=值: 为变量赋值。
24. p1 && p2 : 运行p1;若成功, 在运行p2.
25. p1 || p2 : 运行 p1; 若不成功,则运行p2.
26. 取消元字符的特殊意义方式:
1. 单引号。
2. 双引号。
3. 转义符。
4. 一种引号保护另外一种引号。
5.续行符: \, 若出现在行尾表示续行,若出现在引号内则表示普通字符,#表示是注释的开始。
6. ls .*: 输出所有以.开始的文件目录。
7.echo: 默认输出换行符,若不输出换行符,则用 echo -n。
eg: echo 无参数时,则输出空行,而-n时, 则无输出。
8.grep: grep 模式 文件 不能将模式放在“ ”中。
9.file: 查看文件的格式,有文件的魔术数标志,或者内容关键字表示,与文件的后缀名无关。
三、shell脚本
shell脚本是shell命令组合而成的文件。
1. shell文件的参数:
$0: 表示shell的文件名。
$1 -$9:表示shell文件的前9个参数。
$*: 表示shell文件的所有参数。无参数时,$*为空串。
将程序输出作为参数:eg: echo `date`
命令:pick:pr `pick *.c` | lpr
2. shell变量
变量=值 : 当前shell能够使用。(注意:=左右无空格)
export 变量=值 : 当前shell与子shell都能使用。
$?: 程序执行后,返回的状态码。
$$: bash的进程号。
$PATH: 命令执行的环境路径。
相关文件: /etc/profile、 /etc/.profile、
/home/username/.bash_profile
/home/username/.bash.rc
^或 | 的意义相同。
n>file:将文件描述符n的输出定向到文件。
n>> file: 将文件描述符n的输出追加到文件。
n>&m: 将文件描述符n与文件描述符m的合并输出。
n<&m: 将文件描述符n与文件描述m的合并作为输入。
3.8. shell程序里的循环
for 变量 in 文件列表
do
...
done
for i in * 与 for i in $*的区别,考虑程序的执行性能。