目录
8.3 shell 可识别的命令形式
8.3.1 单条命令
8.3.2 多条命令
8.3.3 复合命令
8.3.4 后台命令
8.4 shell 变量和引用符
8.4.1 环境变量
plus. echo 命令的使用
8.4.2 系统变量
8.4.3 局部变量(用户变量)
8.4.4 单引号、双引号、反撇号和花括号
8.4.5 变量输出命令 export
8.5 shell 的内部命令
这是最常用的命令形式:
$ cat file1
本命令执行完成后出现 shell 提示符,再接收下一条键盘命令。
采用分号隔开多条命令:
$ pwd; who; date
第一条命令执行完成后,无停顿地再执行第二条命令,如此下去。运行功能和效果与在键盘上逐条输入命令并运行是完全一样的,其主要目的是提高键盘命令输入效率。
① 管道前后的命令任意组合、同时运行,形成功能更强大灵活的复合命令:
$ ps –e | grep student
首先看看我们当前运行的进程有哪些:
再来锁定 tty2 进程的信息:
② 括号内的命令从左到右按顺序执行,且由一个子 shell 来单独控制运行,相当于一个小的功能程序。方便灵活,运行效率高:
$ (ls; pwd; ps) > run_log
在普通命令行的行尾加上 & 符号,表示将该命令放到后台执行:
$ ls -lR > file_list &
[1] 7981
注意:-lR 中是小写的 L 和大写的 R,- 是减号!
shell 启动该后台进程后不再等待该进程结束,立即开始接受新的键盘命令——多进程并发,数量不限,充分利用系统资源。
① 每个 shell 都可以设置一组变量来限定 shell 及其子程序的功能模式和取值范围。
② 每个 shell 都可以有完全不同的变量设置,由此构成各具特色的运行环境。
③ 系统环境变量放在 /etc/profile 中,用户环境变量放在用户主目录下的 .profile 文件中。用户 shell 启动时,先执行 /etc/profile,再执行用户主目录下的 .profile 。
④ 环境变量可以在 shell 运行时动态修改。
常用的 shell 环境变量
1. HOME 变量
HOME 变量用于标识当前用户的主目录,也是用户登录系统后的初始目录。用户自己建立的文件都保存在这个目录以及这个目录的子目录下:
$ HOME=/usr/computer/student
2. PATH 变量
PATH 变量用于标识键盘命令的搜索路径。该变量的值是由若干个用冒号隔开的目录名组成的,shell 收到用户的键盘命令后,就从左至右依次在这些目录中查找命令:
$ PATH=/bin:/usr/bin:$HOME/bin:./
# 将会搜索以下目录
# /bin
# /usr/bin
# $HOME/bin
# 当前目录
3. SHELL 变量
SHELL 变量中保存的是当前用户的初始 shell 的路径名称:
$ SHELL=/bin/sh
4. TERM 变量
TERM 变量用于指定当前用户所用的终端类型:
$ TERM=vt100
5. PS1 变量
PS1 变量用于保存系统中的基本提示符,默认值是 "$":
$ PS1=$
$ PS1=IVE:
IVE:
6. IFS 变量
IFS 变量用于 shell 在解释命令行上的各个选项和参数时,定义什么字符是这些选项和参数之间的间隔。通常为空白符:
$ IFS=
1、echo 的功能
功能:在标准输出上显示 echo 后面的字符串,或变量的值。
注意:当字符串中带空白符或其它控制字符时,用引号将其括起来。
2、应用举例
$ echo 12345
12345
$ echo "department computer"
department computer
$ echo "My home directory is: $HOME"
My home directory is: /usr/teacher/david
$ echo –n "Input your choice (y/n) []"
Input your choice (y/n) []
系统变量只能引用不能修改!常用系统变量:
$0 当前shell程序的名字
$1 ~ $9 命令行上的第一到第九个参数
$# 命令行上的参数个数
$* 命令行上的所有参数
$@ 分别用双引号引用命令行上的所有参数
$$ 当前进程的进程标识号(PID)
$? 上一条命令的退出状态
$! 最后一个后台进程的进程标识号
what is 命令行的参数:
$ ./test.sh arg[0] arg[1]
运行 shell 程序的那行命令后面跟着的内容就是命令行参数。
$ echo aa bb cc dd $$
aa bb cc dd 2391
$ cat file1 file2 > file3 2> errlog
$ echo $? 非0表示命令运行失败,错误信息在errlog文件中
$ echo 空行,即echo输出串尾隐含的换行符
$ echo This is a test. 单词间多个空格
This is a test.
$ echo "This is a test." 用引号包括时结果如何
errlog 内容:
cat: file1: 是一个目录
cat: file2: 是一个目录
局部变量是用户根据需要任意创建的。
$ AA=123 定义变量AA
$ echo $AA 引用变量AA的值
123 变量AA的值
$ B="this is a string" 定义变量B,字符串中有空格时用引号
$ echo $B 引用变量B的值
this is a string 变量B的值
1、单引号和双引号
shell 规定:
$ a="he is a student"
$ echo "She said: $a"
She said: he is a student echo执行时,替换了变量$a的值
$ b='The value of a is $a'
$ echo $b
The value of a is $a echo执行时,未替换了变量$a的值
2、反撇号
反撇号在键盘的左上方,将把其中的字符串当作命令执行:
$ a=date
$ echo $a
date 变量a的值是字符串date
$ b=`date` 反撇号中的字符串作为命令名
$ echo $b
Sat Feb 1 16:28:19 Beijing 2003 变量b的值是反撇号中命令的执行结果
3、花括号
花括号将变量名和后面的字符串区分开:
$ c="There is a teach"
$ echo "$cer reading room"
reading room 未定义变量cer,其值用空串替代
$ echo "${c}er reading room"
There is a teacher reading room
新的 shell 变量定义后或已有的 shell 变量修改值后,如果未经 export 命令输出,则只在当前的 shell 中起作用,对其各个子 shell 不产生任何影响。
经过 export 命令输出的变量才能对当前 shell 的各个子 shell、以及子 shell 的子 shell 起作用。
$ PATH=$PATH:./
$ export PATH
说明:
① export 后面的变量名前不加 $ 符号
② 经 export 输出给子 shell 的变量如果在子 shell 中被修改,则只影响子 shell,不影响父 shell;如果在子 shell 中被 export 输出,则也只影响子 shell 的子 shell
③ export 命令常用在 .profile 文件中
exit、echo、cd、pwd、time and so on
shell 的内部命令包含在 shell 内部,用户可以像使用普通命令一样使用这些命令。所不同的是这些命令在 shell 内部识别和执行,而不是文件系统中一个单独的可执行的程序。例如:
cd 改变当前工作目录
pwd 显示当前工作目录
time 显示当前shell运行命令所花费的时间
例如:
$ time ls -lR /usr > flist
real 2m 17.32s 该ls进程的总运行时间
user 0m 7.63s 其中用户程序部分的运行时间
sys 0m 6.79s 其中操作系统核心部分运行时间