Linux 之test expr命令
test指令(使用指令man查询)
功能:检查文件类型,值比较。
test的各种参数和使用。
test EXPRESSION1 –a EXPRESSION2 |
当表达式1和表达式2同时为真时值为真 |
test EXPRESSION1 –o EXPRESSION2 |
当表达式1或者表达式2为真时值为真 |
test –n STRING 或者 test STRING |
当STRING串的长度不为零时值为真 |
test –z STRING |
当STRING串长度为零时值为真 |
test STRING1 = STRING2 |
当STRING1和STRING2相同时值为真 |
test STRING1 != STRING2 |
当STRING1 和 STRING2不同时值为真 |
test INTEGER1 –eq INTEGER2 |
当INTEGER1等于INTEGER2时值为真 |
test INTEGER1 –ge INTEGER2 |
当INTEGER1大于或者等于INTEGER2时值为真 |
test INTEGER1 –gt INTEGER2 |
当INTEGER1 大于INTEGER2时值为真 |
test INTEGER1 –le INTEGER2 |
当INTEGER1小于等于INTEGER2时值为真 |
test INTEGER1 –lt INTEGER2 |
当INTEGER1 小于INTEGER2时值为真 |
test INTEGER1 –ne INTEGER2 |
当INTEGER1不等于INTEGER2时值为真 |
test FILE1 –ef FILE2 |
当FILE1和FILE2有同样的device和inode号时为真(详细见linux文件学习笔记) |
test FILE1 –nt FILE2 |
当FILE1修改时间比FILE2新时值为真 |
test FILE1 –ot FILE2 |
当FILE1修改时间比FILE2旧时值为真 |
test –b FILE |
FILE存在并且内容是block类型的 |
test –c FILE |
FILE存在并且是字符类型的 |
test –d FILE |
FILE存在并且是一个目录 |
test –e FILE |
FILE是否存在 |
test –f FILE |
FILE存在并且是一个正则表达式类型的文档 |
test –g FILE |
FILE存在并且是 set-group-ID也就是SGID(详细见后文学习笔记) |
test –G FILE |
FILE存在并且由有效的GROUP ID所拥有(详细见后文学习笔记) |
test –h FILE |
FILE存在并且是一个符号链接(详细见后文学习笔记) |
test –k FILE |
FILE存在并且设置了sticky bit set(详细见后文学习笔记) |
test –L FILE |
FILE存在并且是一个符号链接 |
test –O FILE |
FILE存在并且由一个有效的USER ID所拥有 |
test –p FILE |
FILE存在并且是一个命名管道(命名管道见后文学习笔记) |
test –r FILE |
FILE存在并且授予了可读的权限 |
test –s FILE |
FILE存在并且size大于0 |
test –S FILE |
FILE存在并且是一个socket |
test –t FD |
文件的描述符FD在终端打开 |
test –u FILE |
FILE存在并且SUID已经被设置 |
test –w FILE |
FILE存在并且授予了写操作权限 |
test –x FILE |
FILE存在并且授予了可执行的权限 |
----------------------------------------------------------------------------------------------------------------------------------------------------
expr
expr是linux的手工命令行计数器,它可以帮助我们完成一些基本的表达式值运算。同时它也是一个字符串处理工具
(1) 整数运算
$expr ARG1 | ARG2
$expr ARG1 & ARG2
$expr ARG1 < ARG2
$expr ARG1 <= ARG2
$expr ARG1 = ARG2
$expr ARG1 != ARG2
$expr ARG1 >= ARG2
$expr ARG1 > ARG2
$expr ARG1 + ARG2
$expr ARG1 – ARG2
$expr ARG1 * ARG2
使用乘法时,需要使用反斜杠进行转义
$expr ARG1 % ARG2
(2) 字符串操作
$expr length “xxx” //计算字符串长度
$expr substr “this is a”pos length //从第pos位开始截取length长度的子串
$expr index “tesr”e //获取e在主串中首次出现的位置
(3) 增量计数
例子
loop=3
loop=`expr $loop + 1`
echo $loop
结果是4,在第二行代码中,使用反引号,shell会将反引号中的内容作为一个系统命令,这样一来,就好像我们在命令行内输入了expr $loop + 1然后这个命令的返回结果被赋值到loop。
(4) 模式匹配(按照正则表达式模式匹配串)
通过指定冒号选项计算字符串中字符数。.*意即任何字符重复0次或多次。
> VALUE=account.doc
> expr $VALUE : ’.*’
8
在expr中可以使用字符串匹配操作,这里使用模式抽取.doc文件附属名。
$expr $VALUE : ‘\(.*\).doc’
accounts
(5) 其他
+ TOKEN
将TOKEN解释为串,不管它是一个关键字或者一个操作符
延伸知识:
引号的作用
1 双引号(“”)
1)使用””可引用除字符$(美元符号)、`(反引号)、\(反斜线)外的任意字符或字符串。双引号不会阻止shell对这三个字符做特殊处理(标示变量名、命令替换、反斜线转义)。
Eg:name=gezn; echo “User name:$name”//将打印User name :gezn
Echo “The date is:`date +date-%d-%m-%Y`”//将打印The date is: 03-05-2009
Echo –e “$USER\t$UID” //将打印gezn 500
2)如果要查新包含空格的字符串经常用到双引号
2 单引号(’’)
1) 如果用单引号把字符串括起来,则dayi9nhao内字符串中的任何特殊字符的特殊含义均被屏蔽。
2) 举例:echo –e ‘$USER\t$UID’//将打印$USER $UID(没有屏蔽\t,是因为选项“-e”的缘故)
echo ‘USER\t$UID’ //将打印$USER\t$UID
3 反引号(``)
1) shell将反引号中的内容作为一个系统命令,并执行其内容。使用这种方法可以替换输出为一个变量
2) 举例:a=`date + date-%d-%m-%Y` //将打印The date is: 03-05-2009
4.反斜线(\)
1)如果下一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义。
2)下属字符包含有特殊含义:& * + $ ` “ | ?
3) 在打印字符串时要加入八进制字符(ASCII相应字符)时,必须在前面加反斜线,否则shell作普通数字处。
举例: bj=Beijing; echo ”variable\$bj=$bj”//将打印variable $bj = beijing
------------------------------------------------------------------------------------------------------------------------------------------------
Shell特殊变量
在Shell中,预先定义了几个有特殊含义的Shell变量,它们的值只能由Shell根据实际情况进行赋值,而不能通过用户重新设置。shell的特殊变量包括它的位置和一些系统变量.
(一)常用位置变量:
$# 命令行上实际参数的个数,但不包含Shell脚本名。
$? 上一条命令执行后的返回值(也称作 “退出码”)。它是一个十进制数。多数Shell命令执行成功时,则返回值为0;如果执行失败,则返回非0值。
$$ 当前进程的进程号。
$! 上一个后台命令对应的进程号,这是一个由1~5位数字构成的数字串。
$- 由当前Shell设置的执行标志名组成的字符串。例如:
set -xv 这个命令行给Shell设置了标志-x和-v(用于跟踪输出)。
$* 表示在命令行中实际给出的所有实参字符串,它并不仅限于9个实参。
$@ 它与$*基本功能相同,但是使用时加引号,并在引号中返回每个参数
$0 脚本名称
$1..$9 第N个参数
下面的aaa bbb 为变量名
${aaa:-bbb} 如果$aaa为空或未定义,则取值$bbb.否则取值$aaa
${aaa:+bbb} 如果$aaa非空,则取值$bbb,否则取值为空
${aaa:=bbb} 如果$aaa非空,则取值$aaa,否则取值$bbb而且赋值(aaa=bbb)
${aaa:3} 如果aaa=abcdefg,则${aaa:3}的值为:defg ,相当于substr,计数从0开始
${aaa:3:2} 如上; ${aaa:3:2}取值为: de.相当于substr
${#aaa} 字符串$aaa的长度.
(二)常用系统变量:
$HOME 用户的主目录
$USER 用户名称
$GROUP 用户所属组名
$PATH 默认的搜索路径
$HOSTNAME 主机名称
$TZ 时区
$MAIL 存放邮件的路径名
练手:
#!/bin/bash
echo $0
echo $*
echo $@
echo $#
echo $$
echo $_
在terminal窗口中执行:
./test.sh -a -b –c /home
./test.sh
-a -b -c /home
-a -b -c /home
4
3250
/home
区别$*和$@编写如下test.sh脚本:
#!/bin/bash
function testargs
{
echo "$# args"
}
testargs "$*"
testargs "$@"
unset -f testargs
在terminal窗口中执行:
./test.sh -a -b /home
1 args //很明显就一个嘛,传入的是$*这个串,不是解释后的参数
3 args //$@必须和引号搭配,所以结果正确
#!/bin/bash
function testargs
{
echo "$# args"
}
testargs $*
testargs $@
unset -f testargs
再次执行有:
./test.sh -a -b /home
3 args
3 args