linux的test命令及相关shell脚本详解

本文深入探讨了Shell脚本的基础知识,包括测试命令、文件运算符、字符串比较、整数比较、条件判断、循环与函数等内容,以及如何在Shell脚本中实现复杂逻辑和流程控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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<str2 若str1比str2排序为小则为真

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 执行脚本之前,先将脚本内容提示在屏幕上



有志者事竟成 破釜沉舟百二秦关终属楚 苦心人天不负 卧薪尝胆三千越甲可吞吴



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值