Aqiaqia * Application
:set noai?????????? 取消行起始位臵设定
:f 或
UNIX Shell
chmod u+x filename 只有自己可以执行,其它人不能执行
chmod ug+x filename 只有自己以及同一群可以执行,其它人不能执行 chmod +x filename 所有人都可以执行
而我們如何指定使用那一Shell 解释所有的Script呢?幾種基本的指定方式如 下所述:
1. 如果Script的第一非空白字元不是\,則它使用Bourne Shell。
2. 如果Script的第一非空白字元是\時,但不以\開,則它使用C Shell。 3. 如果Script以\開頭,則\後面所使用的就是Shell
二、執行命令
基本上和Bourne Shell相同,只有一點在Bourne Shell中的\命令在C Shell 中 則為\命令。
UNIX Shell
1. 概况
UNIX常用shell
Bourne Shell(sh,bash), Korn shell(ksh), csh(csh, tcsh)
与每个shell相关功能/知识如下: . Shell与UNIX之关系 . Shell之特殊性
. Shell环境变量的设臵
小结:shell是用户的UNIX内核的一个接口,进行命令解释(键盘输入),进行文件名和变量 替换,重定向I/O,定位可执行文件,shell可创建子进程并管理其运行;同时shell 维护用户的环境变量,是一个功能强大的编程语言。
shell编程
26
Aqiaqia * Application
Shell编程-分支语句
目标:
完成这一章,你将能够作以下事情: 描述条件选择语句中返回值的作用。
使用test命令来分析一个命令的返回值。 在shell程序中使用if和case结构。
1.返回值
shell变量“?”中保存上一个被执行命令的返回值:
0: ??命令成功地执行(真)
非零:?命令由于出现错误而被终止(假)
例子:
$ true ??????????$ false $ echo $? ??? ???? $ echo $? 0 ???????????? 1 $ ls ???????????$ cp
$ echo $? ??????? ?Usage: cp f1 f2?
0???????????????? cp [-r] f1 ....fn d1 $ echo $??????????$echo $? 0????????????? 1
???????????? ? $echo $? ????????????? 0
所有的UNIX操作系统命令在结束的时候都要产生一个返回值。这个返回值通常被用来判断命令是正常结束(返回0)还是遇到了一些错误(返回非零值)。通过返回的非零值通常可以看出发生的是什么错误。例如,语法错误通常返回1,true命令返回的就是0,而false命令返回的是1。
大多数的shell程序中的判断语句都是通过分析这个返回值来进行流程控制的。shell中定义了一个特殊的变量“?”来保存上一个命令结束后的返回值。 你可以通过以下方式来观察前一个命令的返回值: echo $?
当你执行一个条件判断(小于,大于,等于)的时候,返回值会指明这个条件是否为真(返回0)或者为假(返回非零)。 条件判断语句会在下几节中讲述。
2.test 命令 语法:
27
Aqiaqia * Application
test expression 或者 [expression]
test命令对表达式进行评估,并且设臵返回值。
表达式的值 ??返回值 true??????0
false????? 非零(通常为1) test命令能够评估的对象有: 整数 字符串 文件
test命令被用来评估表达式并且产生返回值。它用参数组成逻辑表达式并且对表达式进行评估。test命令不会产生标准输出。你必须必须通过返回值来判断test命令的结果。如果表达式为真,返回值会为0,如果表达式为假,返回值为1。
test命令可以被单独使用,然后你能够看到返回值,但它用的最多的还是在if和while结构中,用来提供条件流程控制。
test命令的也可以用[expression]来代替。这对提高可读性有帮助,特别是在处理数字或者字符串的时候。
注意:在\和\符号的周围必须要有空格。
3.test命令之数字test 语法:
[ number relation number ]???通过关系运算符来对数字进行比较 关系运算符: -lt ???小于
-le ???小于或者等于 -gt??? 大于
-ge ???大于或者等于 -eq ???等于 -ne ???不等于 例子(假设X=3):
$ [ \???$ [ \ $ echo $? ????? $ echo $? 0 ????????? 1
test命令能被用于比较两个整数之间的数字关系。通常用[.....]语法来调用。test命令的返回值就能说明这个条件为真还是为假。
当testing一个变量的值的时候,你应该防止变量不要为空值,例如:
28
Aqiaqia * Application
$ [ $XX -eq 3]
sh: test:argument expected
如果变量XX在前面没有被赋值,XX的值会是NULL。当shell执行变量替代的时候,shell会试图执行如下语句: [ -eg 3]
而这个语句不是一个完整的test语句,并且会导致一个语法错误。解决这个问题的一个简单的方法就是在被测试的变量的周围加上引号。 [ \
当shell执行变量替代的时候,shell会试图执行如下语句: [\
这会确保至少有一个NULL值作为一个参数提供给这个test命令使用。
注意:作为一个通用的规则,你应该在所有的$变量加上双引号来避免shell进行不正确的变量的替代。
4.test命令之字符串test 语法:
[ string1 = string2] 判断字符串是否相等 [ string1 !=string2] 判断字符串是否不等 例子;
$ X=abc ?????????$ X=abc
$ [ \???? $ [\?!= \ $ echo $? ????????$ echo $? 0???????????? 1
test命令也能够用来计较两个字符串是否相等。 [...] 语法通常用作字符串的比较。你已经看到在[]周围必须要有空格,同时在操作符周围也必须要有空格存在。 字符串操作包括:
string1 = string2 ????如果string1等于string2就为真 string1 != string2 ??? 如果string1不等于string2就为真 z string?????????如果string的长度为0就为真 -n string???????? 如果string的长度为非零就为真 string ?????????如果string的长度为非零就为真
如果变量中包含空白字符,在这里引号同样也能够保护字符串的test,,例如: $ X=\
$ [ $X=yes] ???会导致一个语法错误
shell会解释这个语法为[yes we will = yes ] $ [ \?正确的语法
shell会解释这个语法为:[ \
在执行数字比较的时候,shell会将所有的参数当成是数字,在执行字符串比较的时
29
Aqiaqia * Application
候,shell会把所有的参数当成是字符串。如下例所示: $ X=03 $ Y=3
$ [ \??? 比较数字03和数字3 $ echo $?
0????????????为真-它们是相等的数字
$ [ \????比较字符串“03”和字符串“3” $ echo $?
1????????????为假-它们是不相同的字符串
5.test命令-文件比较 语法:
test -option filename???通过选项对文件进行test 例子:
$ test -f funfile $ echo $? 0
$ test -d funfile $ echo $? 1
shell提供的一个有用的test特性是可以用它来test文件的特征,例如文件类型和许可权限。例如:
$ test -f filename
如果文件存在并且是一个普通文件(不是目录或者设备文件),会返回真(0)。 test -s filename
如果文件存在并且其字节数大于0,会返回真(0)。 其它还有许多有用的文件test方式,比如:
-r file????如果文件存在并且是可读的时候为真 -w file ??? 如果文件存在并且是可写的时候为真 -x file ??? 如果文件存在并且是可执行的时候为真 -d directory ?目录存在并且是个目录的时候为真
6.test命令-其他操作符 语法:
-o ????OR -a ????AND
\\( ?\\) ? GROUPING 例子:
$ [ \
$ [ \ $ test -s file -a -r file 注意:()前面必须要用斜杠。
30