Linux 脚本 命令状态 条件测试

Linux 脚本:

脚本一般为文本文件,运行脚本事实上是运行一个bash进程,此进程负责从脚本文件中读取一个执行逻辑,而后由bash进程负责解析并运行此逻辑;

启动脚本:

(1) # bash /PATH/TO/SCRIPT_FILE

(2) 一个执行权限,

# ./PATH/TO/SCRIPT_FILE

[[email protected] ~]# vi date.sh 
[[email protected] ~]# sh date.sh  #第一种执行方法
Thu, 17 Sep 2015 12:43:37 +0800
[[email protected] ~]# ll
total 4
-rw-r--r-- 1 root root 22 Sep 17 12:43 date.sh
[[email protected] ~]# chmod +x date.sh  #第二种执行方法
[[email protected] ~]# ll
total 4
-rwxr-xr-x 1 root root 22 Sep 17 12:43 date.sh
[[email protected] ~]# ./date.sh 
Thu, 17 Sep 2015 12:44:05 +0800
[[email protected] ~]#

bash脚本的常用选项:

  • -n: 检查脚本中的语法错误;
  • -x:调试执行脚本;

命令状态结果:

bash进程用于追踪执行的命令成功与否的状态:

0: 成功

1-255:失败

[[email protected] ~]# vim date.sh 
[[email protected] ~]# sh -n date.sh 
[[email protected] ~]# sh -x date.sh 
+ date -s
date: option requires an argument -- ‘s‘
Try ‘date --help‘ for more information.
[[email protected] ~]# vi date.sh 
[[email protected] ~]# sh -n date.sh 
[[email protected] ~]# sh -x date.sh 
+ date -R
Thu, 17 Sep 2015 14:36:06 +0800
[[email protected] ~]# echo $?
0
[[email protected] ~]# vi date.sh 
[[email protected] ~]# echo $?
0
[[email protected] ~]# sh  date.sh 
date: option requires an argument -- ‘s‘
Try ‘date --help‘ for more information.
[[email protected] ~]# echo $?
1
[[email protected] ~]#

自定义脚本的状态结果:

exit n

[[email protected] bashtest]# vim t1.sh 
[[email protected] bashtest]# sh -x t1.sh 
+ useradd test001
useradd: user ‘test001‘ already exists
+ echo test001
+ passwd --stdin test001
Changing password for user test001.
passwd: all authentication tokens updated successfully.
+ exit 9
[[email protected] bashtest]# echo $?
9
[[email protected] bashtest]#

注意:脚本中任何位置执行了exit命令即会终止当前shell进程;

条件测试:test

界定程序执行环境;

(1) 根据运行的命令的状态结果;

(2) 测试表达式

test 命令

[空格 命令 空格 ]

[[空格 命令 空格]]

[[email protected] ~]# test -e /test
[[email protected] ~]# echo $?
1
[[email protected] ~]# [ -e /test ]
[[email protected] ~]# echo $?
1
[[email protected] ~]#
[[email protected] ~]# [[ -e /var ]]
[[email protected] ~]# echo $?
0
[[email protected] ~]#

整数测试:隐含着做数值大小比较,所以不要给变量引用加引用;

$A -gt $B:是否大于;是则为“真”,否则为“假”;

$A -ge $B: 是否大于等于;

$A -lt $B:是否小于;

$A -le $B: 是否小于等于;

$A -eq $B: 是否等于;

$A -ne $B:是否不等于;

[[email protected] ~]# a=9
[[email protected] ~]# b=12
[[email protected] ~]# [[ $a -gt $b ]]
[[email protected] ~]# echo $?
1
[[email protected] ~]# [[ $a -ge $b ]]
[[email protected] ~]# echo $?
1
[[email protected] ~]# [[ $a -lt $b ]]
[[email protected] ~]# echo $?
0
[[email protected] ~]# [[ $a -le $b ]]
[[email protected] ~]# echo $?
0
[[email protected] ~]# [[ $a -eq $b ]]
[[email protected] ~]# echo $?
1
[[email protected] ~]# [[ $a -ne $b ]]
[[email protected] ~]# echo $?
0
[[email protected] ~]#

字符串测试:

"$A" > "$B":是否大于;

"$A" < "$B":是否小于;

"$A" == "$B":是否等于;

"$A" != "$B":是否不等于;

-z "$A":是否为空;空则为“真”,否则为“假”

-n "$A":是否不空;不空则“真”,空则为“假”

[[email protected] ~]# a=glancesli  #103 108 97 110 99 101 115 108 105
[[email protected] ~]# b=nancy   #110 97 110 99 121
[[email protected] ~]# test "$a" = "$b" && echo Ture||echo false
false
[[email protected] ~]# [ "$a" == "$b" ] && echo Ture || echo false
false
[[email protected] ~]# [ "$a" != "$b" ] && echo Ture || echo false
Ture
[[email protected] ~]# [ -z "$a" ] && echo Ture || echo false
false
[[email protected] ~]# [ -n "$a" ] && echo Ture || echo false
Ture
[[email protected] ~]# test "$a" \> "$b" && echo ture||echo false
false
[[email protected] ~]# test "$a" \< "$b" && echo ture||echo false
ture
[[email protected] ~]# [[ "$a" < "$b" ]] && echo Ture || echo false
Ture
[[email protected] ~]# [[ "$a" > "$b" ]] && echo Ture || echo false
false
[[email protected] ~]#

注:字符串比较大于小于号必须转义,即加反斜线。字符串比较的顺序是按ASCII表的顺序的,大写字母比小写字母的值小。

文件测试:测试文件的存在性以及属性;

-e $file: 是否存在;存在则为“真”,否则为“假”;

-a $file: 同上;

-f $file:文件是否存在且为普通文件;

-d $file:文件是否存在且为目录;

-h $file:是否存在且为符号链接文件;

-L $file: 同上

-b $file:是否存在且为块设备文件;

-c $file:是否存在且为字符设备文件;

-S $file:是否存在且为套接字文件;

-p $file: 是否存在且为管道文件;

-r $file: 当前用户对文件是否拥有读权限;

-w $file:当前用户对文件是否拥有写权限;

-x $file:当前用户对文件是否拥有执行权限;

-u $file:文件是否拥有SUID权限;

-g $file:文件是否拥有SGID权限;

-k $file:文件是否拥有sticky权限;

-O $file: 当前用户是否为指定文件的属主;

-G $file: 当前用户是否为指定文件的属组;

[[email protected] home]# mkdir abc
[[email protected] home]# ll
total 12
drwxr-xr-x 2 root    root    4096 Sep 17 17:13 abc
drwxr-xr-x 2 root    root    4096 Sep 17 17:01 bashtest
drwx------ 2 user001 user001 4096 Sep 17 15:13 user001
[[email protected] home]# test -e abc
[[email protected] home]# test -e abc && echo true || echo false
true
[[email protected] home]# test -e bcd && echo true || echo false
false
[[email protected] home]# test -a bcd && echo true || echo false
false
[[email protected] home]# test -a abc && echo true || echo false
true
[[email protected] home]# test -f abc && echo true || echo false
false
[[email protected] home]# test -d abc && echo true || echo false
true
[[email protected] home]# ln -s abc/ cde
[[email protected] home]# ll
total 12
drwxr-xr-x 2 root    root    4096 Sep 17 17:13 abc
drwxr-xr-x 2 root    root    4096 Sep 17 17:01 bashtest
lrwxrwxrwx 1 root    root       4 Sep 17 17:15 cde -> abc/
drwx------ 2 user001 user001 4096 Sep 17 15:13 user001
[[email protected] home]# test -h abc && echo true || echo false
false
[[email protected] etc]# test -L system-release && echo true || echo false
true
[[email protected] etc]# test -h system-release && echo true || echo false
true
[[email protected] home]# test -b abc && echo true || echo false
false
[[email protected] home]# test -c abc && echo true || echo false
false
[[email protected] home]# test -r abc && echo true || echo false
true
[[email protected] home]# vim te1.sh
[[email protected] home]# test -rxw abc && echo true || echo false
-bash: test: -rxw: unary operator expected
false
[[email protected] home]# test -w abc && echo true || echo false
true
[[email protected] home]# test -x abc && echo true || echo false
true
[[email protected] home]# test -u abc && echo true || echo false
false
[[email protected] home]# test -O abc && echo true || echo false
true
[[email protected] home]# test -G abc && echo true || echo false
true

双目操作符:

$file1 -nt $file2: file1是否新于file2, file1的最近一次的修改时间戳是否晚于file2的;

$file1 -ot $file2: file1是否旧于file2, file1的最近一次的修改时间戳是否早于file2的;

$file1 -ef $file2:file1与file2是否指向了同一个inode;测试二者是否为同一个文件的硬链接;

[[email protected] bashtest]# ll
total 8
-rwxr-xr-x 1 root root 140 Sep 17 15:42 1.sh
-rw-r--r-- 1 root root  74 Sep 17 15:43 2.sh
-rw-r--r-- 1 root root   0 Sep 17 17:01 nancy
[[email protected] bashtest]# test 2.sh \-ot 1.sh && echo true || echo false
false
[[email protected] bashtest]# test 2.sh \-nt 1.sh && echo true || echo false
true
[[email protected] bashtest]# test 2.sh \-ef 1.sh && echo true || echo false
false
[[email protected] bashtest]# 
[[email protected] bashtest]# ln -s nancy n1.sh
[[email protected] bashtest]# ln -s nancy n2.sh
[[email protected] bashtest]# test n2.sh \-ef n1.sh && echo true || echo false
true
[[email protected] bashtest]#
时间: 2024-10-12 17:11:02

Linux 脚本 命令状态 条件测试的相关文章

shell脚本编程之条件测试——test

test测试命令有三类测试表达式,第一类是进行数值的比较,第二类是进行字符串的比较,第三类是进行文件的测试,比如测试一个文件是否存在等. 1.数值测试,需要两个操作数进行比较 -eq:测试两个数据是否相等,相等为真,不等为假 -ne:被测试的两个数值是否不相等,不等为真,相等为假: -lt:被测试的两个数值,左边的是否小于右边的,小于为真,大于为假: -gt:被测试的两个数值,左边的是否大于右边的,大于为真,小于为假: -le:被测试的两个数值,左边的是否小于等于右边的: 总结一下就是:eq相等

linux脚本命令的用法

grep命令的用法 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. 参数: 1. -A NUM,--after-context=NUM   除了列出符合行之外,并且列出后NUM行. 如:   $ grep –A 1 panda file  (从file中搜寻有panda样式的行,并显示该行的后1行) 2

linux if 命令判断条件总结

关于文件属性的判断式 -a 如果文件存在 -b 如果文件存在,且该文件是区域设备文件 -c 当file存在并且是字符设备文件时返回真 -d 当pathname存在并且是一个目录时返回真 -e 当pathname指定的文件或目录存在时返回真 -f 当file存在并且是普通文件时返回真 -g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真 -h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效 -k 当由pathname指定的文件或目录存在并且设置了"sti

shell脚本的条件测试与比较

条件测试语法: 语法1:test <测试表达式> 这是利用test命令进行条件测试表达式的方法. 语法2:[ <测试表达式> ]:这是通过单括号进行条件测试表达式的方法,和test命令的用法相同,推荐使用的 语法3:[[ <测试表达式> ]]:这是通过[[]]进行条件测试表达式的方法,是比test和[]更新的语法格式 语法4:((<c测试表达式>)):这是通过(())进行条件表达式的方法,一般用于if语句里 针对上面的说明: 语法1和语法2是相同的,语法3是

shell脚本条件测试与比较

1.条件测试常用语法 test 测试表达式 利用test命令进行条件测试表达式,test命令与测试表达式之间至少有一个空格 [ 测试表达式 ] 通过[ ]中括号进行条件测试表达式,[]中括号边界与测试表达式之间至少有一个空格 [[ 测试表达式 ]] 通过[[ ]]双中括号进行条件测试表达式,[[ ]]双中括号与测试表达式之间至少有一个空格 ((测试表达式)) 通过(( ))双小括号进行条件测试表达式,( ))双小括号两端不需要空格,常用于整数对比 说明: 双中括号[[ ]]中可以使用通配符进行匹

工程师技术(五):Shell脚本的编写及测试、重定向输出的应用、使用特殊变量、编写一个判断脚本、编写一个批量添加用户脚本

一.Shell脚本的编写及测 目标: 本例要求两个简单的Shell脚本程序,任务目标如下: 1> 编写一个面世问候 /root/helloworld.sh 脚本,执行后显示出一段话"Hello World!!"   2> 编写一个能输出系统信息的 /root/sysinfo 脚本,执行后依次输出当前红帽系统的版本信息.当前使用的内核版本.当前系统的主机名 方案: 规范Shell脚本的一般组成: 1> #! 环境声明(Sha-Bang)    2> # 注释文本 

shell基础 变量 条件测试 判断结构

Top NSD ENGINEER DAY02 案例1:Shell脚本的编写及测试 案例2:重定向输出的应用 案例3:使用特殊变量 案例4:编写一个判断脚本 案例5:编写一个批量添加用户脚本 1 案例1:Shell脚本的编写及测试 1.1 问题 本例要求两个简单的Shell脚本程序,任务目标如下: 编写一个面世问候 /root/helloworld.sh 脚本,执行后显示出一段话“Hello World!!” 编写一个能输出系统信息的 /root/sysinfo 脚本,执行后依次输出当前红帽系统的

bash脚本编程之条件判断

1.bash脚本编程格式: 顶格写#!/bin/bash 接下来给出一些注释信息,以#开头如: #description #version #auhor ceshi <[email protected]> #date 2017-11-07 然后代码注释 缩进,适度添加空白行 2.变量介绍: 局部变量 本地变量 环境变量 位置参数变量 特殊变量 3.数据类型: 字符型 数值型 4.bash算数运算: 方法①:let var=$num1 op $num2 方法②:var=$[ expression

Shell中的条件测试语句

Shell有条件测试语句,一般用test命令或是[]命令来完成,它们是条件判断语句if~then语句的基础,特别是[]命令.下面我们讲解一些条件测试语句. 1. test命令实现条件测试 对于检测系统中某些文件是否存在,或者相关属性时,test命令很好用. 其基本语法如下: test命令还可以测试字符串: test命令还可以测试整数之间的关系: 2. []命令来实现条件测试 使用中括号[]命令来实现条件测试功能时,要特别注意.因为中括号在很多地方都有用到,比如通配符和正则表达式.而在用[]表示条