test 命令最短的定义可能是评估一个表达式;如果条件为真,则返回一个 0 值。如果表达式不为真,则返回一个大于 0 的值 — 也可以将其称为假值。检查最后所执行命令的状态的最简便方法是使用 $? 值。出于演示的目的,本文中的例子全部使用了这个参数。
test 命令期望在命令行中找到一个参数,当 shell 没有为变量赋值时,则将该变量视为空。这意味着在处理脚本时,一旦脚本寻找的参数不存在,则 test 将报告该错误。
test 文件运算符
利用这些运算符,您可以在程序中根据对文件类型的评估结果执行不同的操作:
逻辑判断:
-b file 如果文件为一个块特殊文件,则为真
-c file 如果文件为一个字符特殊文件,则为真
-d file 如果文件为一个目录,则为真
-e file 如果文件存在,则为真
-f file 如果文件为一个普通文件,则为真
-g file 如果设置了文件的 SGID 位,则为真
-G file 如果文件存在且归该组所有,则为真
-k file 如果设置了文件的粘着位,则为真
-O file 如果文件存在并且归该用户所有,则为真
-p file 如果文件为一个命名管道,则为真
-r file 如果文件可读,则为真
-s file 如果文件的长度不为零,则为真
-S file 如果文件为一个套接字特殊文件,则为真
-t fd 如果 fd 是一个与终端相连的打开的文件描述符(fd 默认为 1),则为真
-u file 如果设置了文件的 SUID 位,则为真
-w file 如果文件可写,则为真
-x file 如果文件可执行,则为真
file1 -ef file2 测试以判断两个文件是否与同一个设备相连,是否拥有相同的 inode 编号
file1 -nt file2 测试以判断第一个文件是否比第二个文件更新(由修改日期决定)
file1 -ot file2 测试以判断第一个文件是否比第二个文件更旧
字符串比较运算符
如标题所示,这组函数比较字符串的值。您可以检查它们是否存在、是否相同或者是否不同。
String 测试以判断字符串是否不为空
-n string 测试以判断字符串是否不为空;字符串必须为 test 所识别
-z string 测试以判断字符串是否为空;字符串必须为 test 所识别
string1 = string2 测试以判断 string1 是否与 string2 相同
string1 != string2 测试以判断 string1 是否与 string2 不同
str1=str2 若str1与str2相同则为真
str1!=str2 若str1与str2不相同则为真
str1
str1>str2 若str1比str2排序较大则为真
-z str 若str长度为0则为真
-n str 若str长度大于0则为真
整数比较运算符
正如字符串比较运算符验证字符串相等或不同一样,整数比较运算符对数字执行相同的功能。如果变量的值匹配则表达式测试为真,如果不匹配,则为假。整数比较运算符不处理字符串(正如字符串运算符不处理数字一样):
int1 -eq int2 如果 int1 等于 int2,则为真
int1 -ge int2 如果 int1 大于或等于 int2,则为真
int1 -gt int2 如果 int1 大于 int2,则为真
int1 -le int2 如果 int1 小于或等于 int2,则为真
int1 -lt int2 如果 int1 小于 int2,则为真
int1 -ne int2 如果 int1 不等于 int2,则为真
[]用在if语句中可以替代test。O(∩_∩)O~!!
特殊符号:? * [] ; && ||
.
代表一个任意字符,一定要有一个字符存在
?
匹配0次或者1次,也可以用于表示单一字符
*
匹配任意次,也可以用于表示任意字符
[^list]
不属于list的元素,与[list]相反
[^range]
不属于range的元素,与[range]相反
\{n\}
与前一个相同条件连续匹配n个
\{n,m\}
与前一个相同条件连续匹配n到m个
-rw-rw-r--(文件权限) 1(文件链接数) chase(拥有者)chase(用户组号) 2(文件大小)Feb 17 00:17(最后修改日期) a.txt(文件名)上面的信息表示文件是由chase拥有和属于chase用户组。而在权限位上,我们可以把它分成四部分:
-(文件类型) rw-(拥有者权限) rw-(用户组权限) r--(其他用户权限)
对于第一部分表示文件的类型,
在linux下一共有七种文件类型,包括:
1、套接字(s),
2、符号链接文件(l),
3、普通文件(-),
4、块设备文件(b),
5、目录(d),
6、字符设备(c)
7、命名管道(P) (括号中是文件在权限位上的表示符)。
其他三部份结构类似,都是用三个字符(rwx)表示。
r对应的是读权限,w对应的是写权限,x对应的是有运行的权限。
对于这三部分我们都可以用三位二进制或一位八进制数来表示,当某一位使能时就把这一位符值为1,如rw-就表示读和写位使能,对应的位赋1,所以在这种情况下可以用二进制110或八进制6表示。
什么是Shell Scripts?
-一系列连续命令
条件判断:
if test ; then
action
else
action
fi
test也可以应用[]替代哦!!
if test -f $1
then
filename=$1
set `ls -il $filename`
echo file $filename inode=$1 and size=$6
fi
if [ -d $1 ]; then
count=`ls $1 | wc -w`
echo directory $1 have$count files
exit 0
fi
注意:
-在[]中,只能有一个判断式
-在[]与[]之间,可以使用&&或||组合
复杂的if语句:
if [ condition ]; then
action
elif [ condition2 ]; then
action2
elif [ condition3 ]; then
action3
else
actionx
fi
-分支判断:
case 字符串 in
串1)
动作1
;;
串2)
动作2
;;
*)
动作3
esac
myvar="hello"
myfunc(){
myvar="one two three"
for x in $myvar
do
echo $x
done
}
#invoke function
myfunc
echo $myvar $x
循环:
-for语句:
for((条件1;条件2;条件3))
do
action
done
for 变量 [in 变量1 变量2 ...]
do
action
done
不带in部分时参数有命令行提供
while语句:只要条件满足就一直执行
while [条件]
do
动作action
done
例子如下:
count=0
while [ $# != 0 ]
do
count=$(($count + $1))
#count=`expr $count + $1`
shift
done
until语句:直到满足条件才退出
until [条件]
do
动作action
done
-语法:
函数名称() {
函数体
}
function 函数名{
函数体
}
-函数调用方法:
函数名称
myvar="hello"
myfunc(){
myvar="one two three"
for x in $myvar
do
echo $x
done
}
#invoke function
myfunc
echo $myvar $x
调试:
-sh [-nv] scripts
-n 不执行脚本,查询脚本语法,有错误就列出
-v 执行脚本之前,先将脚本内容提示在屏幕上
有志者事竟成 破釜沉舟百二秦关终属楚 苦心人天不负 卧薪尝胆三千越甲可吞吴