shell学习十七--条件表达式test、[]、[[]]

一、条件测试 测试语句 在bash的各种流程控制结构中通常要进行各种测试,然后根据测试结果执行不同的操作, 有时也会通过与if等条件语句相结合,让我们可以方便的完成判断。 格式1:test <测试表达式> 格式2:[<条件表达式>] 格式3:[[<条件表达式>]] 说明: 格式1和格式2是等价的。 格式3为扩展的test命令,有网友推荐用格式3。 提示 1、测试文件是否存在 [root@node01 ~]# test -f file&& echo 1||echo 0 0 [root@node01 ~]# touch file [root@node01 ~]# test -f file&& echo 1||echo 0 1 [root@node01 ~]# test ! -f file&& echo 1||echo 0 取反 0 字符串判断 [root@node01 ~]# arg= [root@node01 ~]# test -n "$arg" &&echo 1||echo 0 0 [root@node01 ~]# test ! -n "$arg" &&echo 1||echo 0 1 [root@node01 ~]# test -z "$arg" &&echo 1||echo 0 1 [root@node01 ~]# test -z "$arg" &&echo true||echo false true 2、中括号 [root@node01 ~]# [ -f file ]&& echo 1||echo 0 1 [root@node01 ~]# rm file [root@node01 ~]# [ -f file ]&& echo 1||echo 0 0 [root@node01 ~]# [ ! -f file ]&& echo 1||echo 0 1 可以简写(不存在就不理他) [root@node01 ~]# [ -f file ]||echo 0 [root@node01 ~]# [ -f file ]&& echo 1 1 双中括号 [root@node01 day6]# [[ -f file ]]&& echo 1||echo 0 0 [root@node01 day6]# [[ -f file ]]&& echo 1||echo 0 1 [root@node01 day6]# [[ -f file && -d dir ]]&& echo 1||echo 0 0 [root@node01 day6]# [[ -f file || -d dir ]]&& echo 1||echo 0 1 [root@node01 day6]# mkdir dir [root@node01 day6]# [[ -f file || -d dir ]]&& echo 1||echo 0 1 二、总结 以上3种格式参数用法一样,只是语法会有区别,逻辑符等。 文件测试操作符 -e 该“文件”是否存在(常用)(exist) -f 该“文件”是否为文件(file) (常用) -s 文件的大小是否为0 -d 该“文件”是否为目录(directory) -b 该“文件”是否为一个快设备(block) -c 该“文件”是否为一个字符设备(char) -S 该“文件”是否为一个套接字文件(socket) -P 该“文件”是否为一个FIFO(管道)文件(pipe) -L 该“文件”是否为一个连接文件。(link) 文件的“权限”检测,如 test -r filename -r 检测该文件是否具有“可读”属性 -w 检测该文件是否具有“可写”属性 -x 检测该文件是否具有“可执行”属性 -u 检测该文件是否具有“SUID”属性 -g 检测该文件是否具有“SGID”属性 -k 检测该文件是否具有“Sticky bit”属性 -s 检测该文件是否为“非空白文件” 比较两个文件,如: test file1 -nt file2 -nt 判断file1是否比file2新(newer than) -ot 判断file1是否比file2旧(older than) -ef 判断file1与file2是否为同一个文件,可用于判断硬链接。主要判断两个文件是否均指向通过一个inode。(equal file) 更多用法请查看帮助(man test) 1、实例(针对于文件) [root@node01 day6]# mkdir wolf [root@node01 day6]# [ -f wolf ]&& echo 1||echo 0 1 [root@node01 day6]# mkdir wolf1 [root@node01 day6]# [ -f wolf1 ]&& echo 1||echo 0 0 [root@node01 day6]# [ -e wolf1 ]&& echo 1||echo 0 1 [root@node01 day6]# [ -d wolf1 ]&& echo 1||echo 0 1 [root@node01 day6]# [ -d wolf ]&& echo 1||echo 0 r权限root也有读权限,切换到普通用户测试 [wolf@node01 day6]$ [[ -r wolf ]]&& echo 1||echo 0 0 [wolf@node01 day6]$ [[ -r wolf ]]&& echo 1||echo 0 1 [wolf@node01 day6]$ [ -w wolf ]&& echo 1||echo 0 0 [wolf@node01 day6]$ [ -w wolf ]&& echo 1||echo 0 0 [wolf@node01 day6]$ [ -w wolf ]&& echo 1||echo 0 0 [wolf@node01 day6]$ [ -w wolf ]&& echo 1||echo 0 0 [wolf@node01 day6]$ [ -r wolf ]&& echo 1||echo 0 1 [wolf@node01 day6]$ [ -x wolf ]&& echo 1||echo 0 0 [wolf@node01 day6]$ [ -w wolf ]&& echo 1||echo 0 0 [wolf@node01 day6]$ [ -w wolf ]&& echo 1||echo 0 0 [wolf@node01 day6]$ [ -x wolf ]&& echo 1||echo 0 1 [wolf@node01 day6]$ [ -w wolf ]&& echo 1||echo 0 0 [wolf@node01 day6]$ [ -w wolf ]&& echo 1||echo 0 1 0 2、字符串测试 字符串测试操作符的作用:比较两个字符串是否相同、字符串长度是否为0,字符串 是否为NULL(注:bash区分零长度字符串和空字符串)。 “=”比较两个字符串是否相同,与==等价,如if[ "$a" = "$b" ],其中$a这样的变量 最好用“”括起来,因为如果中间有空格,*等符号就可能出错,当然更好的方法就是 [ "${a}" = "${b}" ]。“!=” 比较两个字符串是否相同,不同则为“是”。 字符串比较符有如下4种(下面的字符串测试操作符号务必用""引起来): = 测试两个字符串是否相等 != 测试两个字符串是否不相等 -z 测试字符串是空字符串 -n 测试字符串是非空字符串 提示: a、-n比较字符串长度是否不为0,如果不为0则为真,如[ -n "$wolf" ] b、-z比较字符串长度是否等于0,如果等于0则为真,如[ -z "$wolf" ] c、字符串比较符号两端最好有空格。多参考系统脚本。 d、字符串或者字符串变量比较都加双引号比较。 例子 [root@node01 day6]# [[ -n "abc" ]]&& echo 1||echo 0 1 [root@node01 day6]# [ -n "" ]&& echo 1||echo 0 0 [root@node01 day6]# laolang="wolf" [root@node01 day6]# [ -n "$laolang" ]&& echo 1||echo 0 1 [root@node01 day6]# laolang="" [root@node01 day6]# [ -n $laolang ]&& echo 1||echo 0 (这里不加双引号就有问题) 1 [root@node01 day6]# [ -n "$laolang" ]&& echo 1||echo 0 0 [root@node01 day6]# [ -z "$laolang" ]&& echo 1||echo 0 1 [root@node01 day6]# laolang="abc" [root@node01 day6]# [ -z "$laolang" ]&& echo 1||echo 0 0 [root@node01 day6]# [ "abc" = "abd" ]&& echo 1||echo 0 0 [root@node01 day6]# [ "abc" = "abc" ]&& echo 1||echo 0 1 [root@node01 day6]# [ "abc" != "abc" ]&& echo 1||echo 0 0 [root@node01 day6]# [ "abc" != "abd" ]&& echo 1||echo 0 1 [root@node01 day6]# test="" [root@node01 day6]# [ "$test" != "abd" ]&& echo 1||echo 0 1 [root@node01 day6]# test="abd" [root@node01 day6]# [ "$test" != "abd" ]&& echo 1||echo 0 0 3、整数比较 在[]中使用的比较符,两个整数之间的判断,例如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) 在(())和[[]]中使用的比较符 ==或者= 判断两数值相等(equal) != 判断两数值不等(not equal) > 判断n1大于n2(greater than) >= 判断n1小于n2(less than) < 判断n1大于等于n2(greater than or equal) <= 判断n1小于等于n2(less than or equal) 注意: a、=和!=在[]中使用不需要转义,包含“<”和“>”的符号在[]中使用需要转义,对于数字 不转义的结果未必会报错,但是结果可能会不对。 b、"<"符号的意思是小于,if[[ "$a" < "$b" ]],if[ "$a" < "$b" ].在[]中需要转义, 因为shell也用<和>重定向。 c、">"符号的意思是大于,if[[ "$a" > "$b" ]],if[ "$a" > "$b" ].在[]中需要转义, 因为shell也用<和>重定向。 d、比较最好用== 例子 [root@node01 day6]# [ 12 -eq 13 ]&&echo 1||echo 0 0 [root@node01 day6]# [ 12 -gt 13 ]&&echo 1||echo 0 0 [root@node01 day6]# [ 12 -lt 13 ]&&echo 1||echo 0 1 [root@node01 day6]# [ 12 < 13 ]&&echo 1||echo 0 -bash: 13: No such file or directory 0 [root@node01 day6]# [ 12 \< 13 ]&&echo 1||echo 0 1 [root@node01 day6]# [ 12 \> 13 ]&&echo 1||echo 0 0 [root@node01 day6]# [[ 12 > 13 ]]&&echo 1||echo 0 0 [root@node01 day6]# [[ 12 < 13 ]]&&echo 1||echo 0 1 [root@node01 day6]# [[ 12 = 13 ]]&&echo 1||echo 0 0 [root@node01 day6]# [[ 12 = 12 ]]&&echo 1||echo 0 1 [root@node01 day6]# (( 12 = 12 ))&&echo 1||echo 0 比较最好用== -bash: ((: 12 = 12 : attempted assignment to non-variable (error token is "= 12 ") 0 You have new mail in /var/spool/mail/root [root@node01 day6]# (( 12 == 12 ))&&echo 1||echo 0 1 4、逻辑操作符 多重条件判断 在[]中使用逻辑操作符 -a (and)两个条件同时成立。例如: test -r file -a -x file 若文件file具有可读和可执行权限,则为真。 -o (or)两个条件任何一个成立。例如: test -r file -o -x file 则file具有r或x权限时,就可以回传true ! 条件求反,如test ! -x file,当file 不具有x时,回传true 在[[]]中使用逻辑操作符 && and与,两端都为真 || or或,两端有一个为真 ! not非,相反则为真 结论:-a&&的运算规则:只有两端都是1才是真 真1 假0 and 1*0=0 假 and 0*1=0 假 and 1*1=1 真 and 0*0=0 假 只有两端都是1才为真 结论:-o|| 两端都是0才为假,任何一端不为0都是真。 or 1+0=0 真 or 0+1=0 真 or 1+1=1 真 or 0+0=0 假 两端都是0才为假,不为0就是真。 例子: [root@node01 day6]# ll /etc/rc.local lrwxrwxrwx. 1 root root 13 Jul 7 07:37 /etc/rc.local -> rc.d/rc.local You have new mail in /var/spool/mail/root [root@node01 day6]# ll /etc/services -rw-r--r--. 1 root root 641020 Oct 2 2013 /etc/services [root@node01 day6]# f1=/etc/rc.local;f2=/etc/services [root@node01 day6]# [ -f "$f1" && -f "$f2" ]&& echo 1||echo 0 -bash: [: missing `]' 0 [root@node01 day6]# [ -f "$f1" -a -f "$f2" ]&& echo 1||echo 0 1 [root@node01 day6]# [[ -f "$f1" && -f "$f2" ]]&& echo 1||echo 0 1 [root@node01 day6]# [ -n "$f1" -a -z "$f2" ]&& echo 1||echo 0 0 [root@node01 day6]# [ -n "$f1" -o "$f2" ]&& echo 1||echo 0 1 [root@node01 day6]# [ -n "$f1" -o "$f2" = "$f1" ]&& echo 1||echo 0 1 [root@node01 day6]# [ -n "$f1" -a "$f2" = "$f1" ]&& echo 1||echo 0 0 [root@node01 day6]# echo ${#f1} 13 [root@node01 day6]# echo ${#f2} 13 [root@node01 day6]# [ -n "$f1" -a "${#f2}" = "${#f1}" ]&& echo 1||echo 0 1 [root@node01 day6]# [root@node01 day6]# n1=12;n2=13 [root@node01 day6]# [[ $n1 -eq $n2 && -z "$1" ]]&& echo 1||echo 0 0 [root@node01 day6]# [[ ! $n1 -eq $n2 && ! -z "$n1" ]]&& echo 1||echo 0 1 学习可以多看系统脚本/etc/init.d/ test条件表达式 [root@node01 day6]# test -f $f1&&echo 1||echo 0 1 [root@node01 day6]# test -f $f1&&echo 1||echo 0 1 [root@node01 day6]# test -n "$f1"&&echo 1||echo 0 1 [root@node01 day6]# test -z "$f1"&&echo 1||echo 0 1 [root@node01 day6]# test $n1 -eq $n2&&echo 1||echo 0 0 [root@node01 day6]# test $n1 -eq $n2 -a -z "$2" &&echo 1||echo 0 0 [root@node01 day6]# test a -ot b &&echo 1||echo 0 1 [root@node01 day6]# test a -nt b &&echo 1||echo 0 0 连接文件 [root@node01 day6]# test a -ef b &&echo 1||echo 0 0 [root@node01 day6]# ln a c [root@node01 day6]# test a -ef c &&echo 1||echo 0 1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2280端口映射到公网,发现经常被暴力破解,自己写了个临时封禁ip功能的脚本,实现5分钟内同一个ip登录密码错误10次就封禁这个ip5分钟,并且进行邮件通知使用步骤openwrt为19.07.03版本,其他版本没有测试过安装bashmsmtpopkg
#!/bin/bashcommand1&command2&wait从Shell脚本并行运行多个程序–杨河老李(kviccn.github.io)
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/phpls-ls 2.编辑修改.bash_profile文件(没有.bash_profile文件的情况下回自动创建)sudovim~/.bash_profile在文件的最后输入以下信息,然后保存退出exportPATH="/Applications/MAMP/bin/php/php7.2.20/b
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如zh_CN之类的语言包,进行中文语言包装:apt-getinstalllanguage-pack-zh-hans3、安装好后我们可以进行临时修改:然后添加中文支持: locale-genzh_CN.UTF-8临时修改> export LC_ALL='zh_CN.utf8'> locale永久
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexadecimalbash2#[0~1]0[0~7]0x[0~f]or0X[0~f]perl0b[0~1]0[0~7]0x[0~f]tcl0b[0~1]0o[0~7]0x[0~f]bashdifferentbaserepresntationreference2.StringlengthLanguageStr
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全命令补全方法:yum-yinstallbash-completionsource/usr/share/bash-completion/bash_completionsource<(kubectlcompletionbash)echo"source<(kubectlcompletionbash)">>~/.bashrc 
参考这里启动jar包shell脚本修改过来的#!/bin/bash#默认应用名称defaultAppName='./gadmin'appName=''if[[$1&&$1!=0]]thenappName=$1elseappName=$defaultAppNamefiecho">>>>>>本次重启的应用:$appName<
#一个数字的行#!/bin/bashwhilereadlinedon=`echo$line|sed's/[^0-9]//g'|wc-L`if[$n-eq1]thenecho$linefidone<1.txt#日志切割归档#!/bin/bashcd/data/logslog=1.logmv_log(){[-f$1]&&mv$1$2
#文件增加内容#!/bin/bashn=0cat1.txt|whilereadlinedon=[$n+1]if[$n-eq5]thenecho$lineecho-e"#Thisisatestfile.\n#Testinsertlineintothisfile."elseecho$linefidone#备份/etc目录#
# su - oraclesu: /usr/bin/ksh: No such file or directory根据报错信息:显示无法找到文件 /usr/bin/ksh果然没有该文件,但是发现存在文件/bin/ksh,于是创建了一个软连接,可以规避问题,可以成功切换到用户下,但无法执行系统自带命令。$. .bash_profile-ksh: .: .b
history显示历史指令记录内容,下达历史纪录中的指令主要的使用方法如果你想禁用history,可以将HISTSIZE设置为0:#exportHISTSIZE=0使用HISTIGNORE忽略历史中的特定命令下面的例子,将忽略pwd、ls、ls-ltr等命令:#exportHISTIGNORE=”pwd:ls:ls-ltr:”使用HIS
一.命令历史  1.history环境变量:    HISTSIZE:输出的命令历史条数,如history的记录数    HISTFILESIZE:~/.bash_history保存的命令历史记录数    HISTFILLE:历史记录的文件路径    HISTCONTROL:     ignorespace:忽略以空格开头的命令
之前在网上看到很多师傅们总结的linux反弹shell的一些方法,为了更熟练的去运用这些技术,于是自己花精力查了很多资料去理解这些命令的含义,将研究的成果记录在这里,所谓的反弹shell,指的是我们在自己的机器上开启监听,然后在被攻击者的机器上发送连接请求去连接我们的机器,将被攻击者的she
BashOne-LinersExplained,PartI:Workingwithfileshttps://catonmat.net/bash-one-liners-explained-part-oneBashOne-LinersExplained,PartII:Workingwithstringshttps://catonmat.net/bash-one-liners-explained-part-twoBashOne-LinersExplained,PartII
Shell中变量的作用域:在当前Shell会话中使用,全局变量。在函数内部使用,局部变量。可以在其他Shell会话中使用,环境变量。局部变量:默认情况下函数内的变量也是全局变量#!/bin/bashfunctionfunc(){a=99}funcecho$a输出>>99为了让全局变量变成局部变量
1、多命令顺序执行;  命令1;命令2  多个命令顺序执行,命令之间没有任何逻辑联系&&  命令1&&命令2  逻辑与,当命令1正确执行,才会执行命令2||  命令1||命令2  逻辑或,当命令1执行不正确,才会执行命令2例如:ls;date;cd/home/lsx;pwd;who ddif=输入文件of=输
原博文使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗?首先,这个符号(#!)的名称,叫做"Shebang"或者"Sha-bang"。Linux执行文件时发现这个格式,会把!后的内容提取出来拼接在脚本文件或路径之前,当作实际执行的命令。 Shebang这个符号通常在Unix系统的脚本
1、历史命令history[选项][历史命令保存文件]选项:-c:  清空历史命令-w:  把缓存中的历史命令写入历史命令保存文件 ~/.bash_historyvim/etc/profile中的Histsize可改存储历史命令数量历史命令的调用使用上、下箭头调用以前的历史命令使用“!n”重复执行第n条历史
目录1.Shell脚本规范2.Shell脚本执行3.Shell脚本变量3.1环境变量3.1.1自定义环境变量3.1.2显示与取消环境变量3.1.3环境变量初始化与对应文件的生效顺序3.2普通变量3.2.1定义本地变量3.2.2shell调用变量3.2.3grep调用变量3.2.4awk调用变量3.3
   http://www.voidcn.com/blog/wszzdanm/article/p-6145895.html命令功能:显示登录用户的信息命令格式:常用选项:举例:w显示已经登录的用户及正在进行的操作[root@localhost~]#w 11:22:01up4days,21:22, 3users, loadaverage:0.00,0.00,0.00USER