shell识别三种基本命令:内建命令、Shell函数以及外部命令:
内建命令就是由shell本身所执行的命令。有些命令是由于其必要性才内建的;例如:cd、read; 另一种内建命令的存在则是为了效率,其中最典型的就是test命令(稍后有介绍),编写脚本时会经常用到它。另外还有I/O命令。例如echo 和 printf。
Shell函数是功能健全的一系列程序代码,以Shell语言写成,它们可以像命令那样引用,稍后也有介绍;
外部命令就是由Shell的副本(新的进程)所执行的命令,基本过程如下:
a、建立一个新的进程。此进程即为Shell的一个副本。
b、在新的进程里,在PATH变量内所列出的目录中,寻找特定的命令。 /bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin为PATH变量典型的默认值。当命令名称含有斜杠(/)符时,将掠过路径查找步骤;
c、在新的进程里,以所找到的新程序取代执行中的Shell程序并执行。
d、程序完成后,最初的Shell会接着从终端读取的下一条命令,或执行脚本里的下一条命令;
在Shell的世界里,变量值可以是(而且通常是)空值,也就是不含任何字符。这是合理的,也是常见的,好用的特性。空值就是null;
Shell变量名称的开头是一个字母或下划线符号,后面可以接着任意长度的字母、数字或下划线符号。变量名称的字符长度并无限制。
注意:
变量赋值的方式为:先写变量名称,紧接着=字符,最后是新值,中间完全没有任何空格(这点于C/C++很大区别)。 当要取出shell变量的值时,需于变量名称前面加上$字符。当所赋值的值内含空格时,请加上引号;
first=isaac middle=bashevis last=singer
fullname="isaac bashevis singer"; //等号左右两边都没有空格
oldname=$fullname; //此处要加上$符
fullname="$firsh $middle $last"; //将几个变量连接起来,要加上双引号
printf命令模仿C程序库(library)里的printf()库程序(library routine)。它几乎复制了该函数的所有的功能;
printf "hello world"
printf不像echo那样会自动提供一个换行的符号。你必须显式地将换行符指定成\n 。 printf命令的完整语法分为两部分:
printf format-string [arguments .......]
$printf "The first program always prints '%s, %s ! '\n " Hello world
The first program always prints 'Hello, world !'
标准输入/输出被称为:标准输入、标准输出、以及标准错误输出;
示例:等登录shell时,UNIX便将默认的标准输入、输出以及错误输出安排成你的终端。I/O重定向就是通过与终端交互,或是在shell脚本里设置
重新安排从哪里输入或输出到哪里;
以 < 改变标准输入
program < file 可将program的标准输入改为file;
以 > 改变标准输出
program > file 可将program的标准输出修改为file;
> 重定向符在目标文件不存在时,会新建一个。然而,如果目标文件已存在,它就会被覆盖掉,原本的数据都会丢失;
以 >> 附加到文件;
program >> file
如果目标文件不存在, >>重定向符便会新建一个。如果目标文件存在,它不会直接覆盖掉文件,而是将程序所产生的数据附加到文件结尾处;
以 | 建立管道:
program1 | program2
将program1的标准输出作为program2的标准输入。虽然< 和 > 可将输入与输出连接到文件,但管道可以使得执行速度比使用临时文件的程序块10倍以上;
unix系统提供了两个对shell编程特别有用的特殊文件。第一个文件/dev/null, 就是大家熟知的位桶(bit bucket)。传送到此文件的数据都被系统丢掉。也就是说,当程序将数据写到此文件时,会认为它已成功完成写入数据的操作,但实际上什么事都没做。如果需要的是命令的退出状态。而非它的输出,此功能会很有用。例如,测试一个文件是否包含某个模式:
if grep pattern myfile > /dev/null
then
.... //找到模式
else
.... // 找不到模式时
fi
相对地,读取/dev/null则会立即返回文件结束符号。读取/dev/null的操作很少会出现在Shell程序里,不过了解这个文件的行为模式还是非常重要的;
另一个特殊文件为/dev/tty。 当程序打开此文件时,unix会自动将他重定向到一个终端【一个实体控制台或者串口】,也可能是通过网络与窗口登录的伪终端再与程序结合。这在程序必须读取人工输入是特别有用;