Linux shell编程参考文档
echo “The sum is $z” (2)设置权限
[root@localhost bin]#chmod +x test4 (3)执行
[root@localhost bin]#./ test4 45 78
The sum is 123
注意:
表达式 total=`expr $total +$num`及 num=`expr $num +1`中的符号“`”为键盘左上角的 “`”键。
1、特殊符号
(1)引用符号
在bash中,许多字符有特殊的含义。如果希望bash忽略某些字符的特殊含义,可以使用一种称为“引用”的技术,通知Shell暂时忽略被引用字符的特殊含义,将其作为普通字符处理。
Shell在使用“引用”时用到三种字符:转义符“\\”、单引号“?”和双引号“””
? 引用符号1 — 转义符“\\”
将转义符“\\”放在Shell特殊字符之前,则Shell忽略该字符原有的特殊含义。
用这种方式时,必须在每一个欲忽略其特殊含义的特殊字符之前添加一个“\\”字符。
? 引用符号2 — 单引号“’”
将字符串放在一对单引号之间,则单引号内的所有字符的特殊含义都被忽略,而只作为普通字符解释。
例1:下面两条命令是等效的。 # echo ?f*?? # echo f\\*\\? 例2:
# string=?$PATH? # echo $string $PATH 例3:
# name=liuhongqi’s home
? 引用符号3 — 双引号“””
使用双引号的引用与单引号的类似,括在双引号内的大部分特殊字符将被看作普通字符,但也有一些特殊字符即便用双引号括起来之后仍然保留着其特殊的意义,比如$、\\、”和`。
例:假定变量PATH的值为/usr/bin # string=“$PATH and \\$PATH” # echo $string /usr/bin and $PATH
(2) 命令替换符“`”
命令替换符“`”(反引号)的作用跟引用字符的作用相反。反引号括起来的字符串被Shell解释为命令行,在执行时,Shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。
这个字符所对应的键一般位于键盘的左上角。 例1: # pwd /root
# string=“Current directory is `pwd`” # echo $string
Current directory is /root 例2:
Linux Shell编程 第7页/共26页
Linux Shell 编程参考文档
# today=`date`
# echo Today is $today
Today is Mon Jan 15 16:20:12 CST 2002
2、expr 命令
expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。
格式为: expr Expression (命令读入Expression 参数,计算它的值,然后将结果写入到标准输出) 参数应用规则:
? 用空格隔开每个项;
? 用 \\ (反斜杠) 放在 shell 特定的字符前面;
? 对包含空格和其他特殊字符的字符串要用引号括起来
expr用法实例讲解(1)整数运算 # expr 14 % 9 5
# expr 1000 + 900 1900
# expr 30 / 3 / 2 5
# expr 30 \\* 3 (使用乘号时,必须用反斜线屏蔽其特定含义。) 90
# expr 30 * 3 expr: Syntax error
(2)计算字串长度
# expr length “this is a test” 14
(3)增量计数
说明:expr在循环中用于增量计算。先将变量初始化为0,然后循环值加1,反引号的用法为命令替代。
# LOOP=0
# LOOP=`expr $LOOP + 1`
1-5 表达式的比较
?? 字符串操作符 ?? 逻辑运算符 ?? 用 tes t 比较的运算符 ?? 数字比较符 ?? 文件操作符
在 Shell 程序中,通常使用表达式比较来完成逻辑任务。表达式所代表的操作符有字符操作 符、数字操作符、逻辑操作符、以及文件操作符。其中文件操作符是一种 Shell 所独特的操作符。 因为 Shell 里的变量都是字符串,为了达到对文件进行操作的目的,于是才提供了文件操作符。
1-5-1 字符串比较 Linux Shell编程 第8页/共26页
Linux shell编程参考文档
作用:测试字符串是否相等、长度是否为零,字符串是否为 NULL。 常用的字符串操作符如表 1-1所示.。
表 1-1
常用的字符串操作符
字符串操作符 = != -n -z 含义及返回值 比较两个字符串是否相同,相同则为“真” 比较两个字符串是否不相同,不同则为“真” 比较两个字符串长度是否大于零,若大于零则为“真” 比较两个字符串长度是否等于零,若等于零则为“真”
【例1】 字符串比较的使用。 # str1=abcd
# test $str1 = abcd # echo $?
【例2】 含有空格的字符串的比较。 # strl=“” # test $str1 # echo $? # test “$str1” # echo $?
# test –n “$str1” # echo $?
实例 1-6:从键盘输入两个字符串,判断这两个字符串是否相等,如相等输出。
test 命令的测试功能
test是Shell程序中的一个表达式,用test命令去判断文件的存在与性质,变量的相互关系;如果条件为真,则返回一个 0 值。如果表达式不为真,则返回一个大于 0 的值, 也可以将其称为假值。检查最后所执行命令的状态的最简便方法是使用 $? 值。
test 命令期望在命令行中找到一个参数,当 shell 没有为变量赋值时,则将该变量视为空。这意味着在处理脚本时,一旦脚本寻找的参数不存在,则 test 将报告该错误。
test 和 [ 命令
虽然 Linux 和 UNIX 的每个版本中都包含 test 命令,但该命令有一个更常用的别名 — 左方括号:[。test 及其别名通常都可以在 /usr/bin 或 /bin (取决于操作系统版本和供应商)中找到。当您使用左方括号而非 test 时,其后必须始终跟着一个空格、要评估的条件、一个空格和右方括号。右方括号不是任何东西的别名,而是表示所需评估参数的结束。条件两边的空格是必需的,这表示要调用 test。
test 和 [ 的语法如下:test expression
Linux Shell编程 第9页/共26页
Linux Shell 编程参考文档
测试的标志代表意义
1. 关於某个档名的『文件类型』判断,如 test -e filename 表示存在否 -e 该『档名』是否存在?(常用)
-f 该『档名』是否存在且为文件(file)?(常用)
-d 该『档名』是否存在且为目录(directory)?(常用) -b 该『档名』是否存在且为一个 block device 装置? -c 该『档名』是否存在且为一个 character device 装置? -S 该『档名』是否存在且为一个 Socket 文件?
-p 该『档名』是否存在且为一个 FIFO (pipe) 文件? -L 该『档名』是否存在且为一个连结档?
2. 关於文件的权限侦测,如 test -r filename 表示可读否 (但 root 权限常有例外) -r 侦测该档名是否存在且具有『可读』的权限? -w 侦测该档名是否存在且具有『可写』的权限? -x 侦测该档名是否存在且具有『可运行』的权限? -u 侦测该档名是否存在且具有『SUID』的属性? -g 侦测该档名是否存在且具有『SGID』的属性? -k 侦测该档名是否存在且具有『Sticky bit』的属性? -s 侦测该档名是否存在且为『非空白文件』?
3. 两个文件之间的比较,如: test file1 -nt file2 -nt (newer than)判断 file1 是否比 file2 新 -ot (older than)判断 file1 是否比 file2 旧
-ef 判断 file1 与 file2 是否为同一文件,可用在判断 hard link 的判定上。主要意义在判定,两个文件是否均指向同一个 inode!
4. 关於两个整数之间的判定,例如 test n1 -eq n2 -eq 两数值相等 (equal) -ne 两数值不等 (not equal) -gt n1 大於 n2 (greater than) -lt n1 小於 n2 (less than)
-ge n1 大於等於 n2 (greater than or equal) -le n1 小於等於 n2 (less than or equal)
5. 判定字串的数据
test -z string 判定字串是否为 0 ?若 string 为空字串,则为 true
test -n string 判定字串是否非为 0 ?若 string 为空字串,则为 false。 注: -n 亦可省略
test str1 = str2 判定 str1 是否等於 str2 ,若相等,则回传 true test str1 != str2 判定 str1 是否不等於 str2 ,若相等,则回传 false
Linux Shell编程 第10页/共26页
Linux shell编程参考文档
6. 多重条件判定,例如: test -r filename -a -x filename
-a (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。
-o (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true。
! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true
Linux Shell编程 第11页/共26页