受欢迎的建网站哪家好,湛江手机建站模板,编程入门基础知识,商业空间设计调研报告linux_if 参数 shell 编程中使用到得if语句内判断参数 –b 当file存在并且是块文件时返回真 -c 当file存在并且是字符文件时返回真 -d 当pathname存在并且是一个目录时返回真 -e 当pathname指定的文件或目录存在时返回真 -f 当file存在并且是正规文件时返回真 -g 当由pathname指… linux_if 参数 shell 编程中使用到得if语句内判断参数 –b 当file存在并且是块文件时返回真 -c 当file存在并且是字符文件时返回真 -d 当pathname存在并且是一个目录时返回真 -e 当pathname指定的文件或目录存在时返回真 -f 当file存在并且是正规文件时返回真 -g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真 -h 当file存在并且是符号链接文件时返回真该选项在一些老系统上无效 -k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真 -p 当file存在并且是命令管道时返回为真 -r 当由pathname指定的文件或目录存在并且可读时返回为真 -s 当file存在文件大小大于0时返回真 -u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真 -w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。 -o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。 UNIX Shell 里面比较字符写法 -eq 等于 -ne 不等于 -gt 大于 -lt 小于 -le 小于等于 -ge 大于等于 -z 空串 两个字符相等 ! 两个字符不等 -n 非空串 ------------------------------------------------------------------------- 更为详细的说明 运算符 描述 示例 文件比较运算符 -e filename 如果 filename 存在则为真 [ -e /var/log/syslog ] -d filename 如果 filename 为目录则为真 [ -d /tmp/mydir ] -f filename 如果 filename 为常规文件则为真 [ -f /usr/bin/grep ] -L filename 如果 filename 为符号链接则为真 [ -L /usr/bin/grep ] -r filename 如果 filename 可读则为真 [ -r /var/log/syslog ] -w filename 如果 filename 可写则为真 [ -w /var/mytmp.txt ] -x filename 如果 filename 可执行则为真 [ -L /usr/bin/grep ] filename1 -nt filename2 如果 filename1 比 filename2 新则为真 [ /tmp/install/etc/services -nt /etc/services ] filename1 -ot filename2 如果 filename1 比 filename2 旧则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ] 字符串比较运算符 请注意引号的使用这是防止空格扰乱代码的好方法 -z string 如果 string 长度为零则为真 [ -z $myvar ] -n string 如果 string 长度非零则为真 [ -n $myvar ] string1 string2 如果 string1 与 string2 相同则为真 [ $myvar one two three ] string1 ! string2 如果 string1 与 string2 不同则为真 [ $myvar ! one two three ] 算术比较运算符 num1 -eq num2 等于 [ 3 -eq $mynum ] num1 -ne num2 不等于 [ 3 -ne $mynum ] num1 -lt num2 小于 [ 3 -lt $mynum ] num1 -le num2 小于或等于 [ 3 -le $mynum ] num1 -gt num2 大于 [ 3 -gt $mynum ] num1 -ge num2 大于或等于 [ 3 -ge $mynum ] linux_if 格式 if 语句格式 if 条件then Commandelse Commandfi 别忘了这个结尾If语句忘了结尾fitest.sh: line 14: syntax error: unexpected end of fi if 的三种条件表达式 ifcommandthenif 函数then 命令执行成功等于返回0 比如grep ,找到匹配执行失败返回非0 grep,没找到匹配if [ expression_r_r_r ]then 表达式结果为真则返回0if把0值引向thenif test expression_r_r_rthen 表达式结果为假则返回非0if把非0值引向then [ ] ——快捷if [ -f /etc/shadow ] echo This computer uses shadow passwors 可以理解为then 如果左边的表达式为真则执行右边的语句 shell的if与c语言if的功能上的区别 shell if c语言if0为真走then 正好相反非0走then 不支持整数变量直接if必须:if [ i –ne 0 ]但支持字符串变量直接ifif [ str ] 如果字符串非0 支持变量直接ifif (i ) 以command作为if 条件 以多条command或者函数作为if 条件 echo –n “input:”read userif多条指令,这些命令之间相当于“and”与grep $user /etc/passwd /tmp/null who -u | grep $userthen 上边的指令都执行成功,返回值$?为00为真运行then echo $user has loggedelse 指令执行失败$?为1运行else echo $user has not loggedfi # sh test.shinput : macgmacg pts/0 May 15 15:55 . 2075 (192.168.1.100)macg has logged # sh test.shinput : dddddd has not logged 以函数作为if条件 (函数就相当于command,函数的优点是其return值可以自定义) if以函数作为if条件getynthen 函数reture值0为真走thenecho your answer is yeselse 函数return值非0为假走elseecho your anser is nofi if command 等价于 commandif $? $ vi testsh.sh#!/bin/shifcat 111-tmp.txt | grep ting1thenecho foundelseecho no foundfi $ vi testsh.sh#!/bin/shcat 111-tmp.txt | grep ting1if [ $? -eq 0 ]thenecho $?echo foundelseecho $?echo no foundfi$ sh testsh.shno found $ sh testsh.sh1no found$ vi 111-tmp.txtthat is 222filethisting1 is 111file$ sh testsh.shthisting1 is 111filefound$ vi 111-tmp.txtthat is 222filethisting1 is 111file$ sh testsh.shthisting1 is 111file0found 以条件表达式作为 if条件 传统if 从句子——以条件表达式作为 if条件if [ 条件表达式 ]then command command commandelse command commandfi 条件表达式 文件表达式 if [ -f file ] 如果文件存在if [ -d ... ] 如果目录存在if [ -s file ] 如果文件存在且非空 if [ -r file ] 如果文件存在且可读if [ -w file ] 如果文件存在且可写if [ -x file ] 如果文件存在且可执行 整数变量表达式 if [ int1 -eq int2 ] 如果int1等于int2 if [ int1 -ne int2 ] 如果不等于 if [ int1 -ge int2 ] 如果if [ int1 -gt int2 ] 如果if [ int1 -le int2 ] 如果if [ int1 -lt int2 ] 如果 字符串变量表达式 If [ $a $b ] 如果string1等于string2 字符串允许使用赋值号做等号if [ $string1 ! $string2 ] 如果string1不等于string2 if [ -n $string ] 如果string 非空(非0返回0(true) if [ -z $string ] 如果string 为空if [ $sting ] 如果string 非空返回0 (和-n类似) 条件表达式引用变量要带$ if [ a b ] ;then echo equalelseecho no equalfi[macgmachome ~]$ sh test.shinput a:5input b:5no equal 等于表达式没比较$a和$b,而是比较和a和b,自然a!b) 改正 if [ $a $b ] ;then echo equalelseecho no equalfi[macgmachome ~]$ sh test.shinput a:5input b:5equal -eq -ne -lt -nt只能用于整数不适用于字符串字符串等于用赋值号 [macgmachome ~]$ vi test.shecho -n input your choice:read varif [ $var -eq yes ]thenecho $varfi[macgmachome ~]$ sh -x test.shinput your choice:ytest.sh: line 3: test: y: integer expression_r_r_r expected 期望整数形式即-eq不支持字符串 放在别的地方是赋值,放在if [ ] 里就是字符串等于,shell里面没有的,那是c语言的等于 无空格的字符串可以加 ,也可以不加 [macgmachome ~]$ vi test.shecho input a:read aecho input is $aif [ $a 123 ] ; thenecho equal123fi[macgmachome ~]$ sh test.shinput a:123input is 123equal123 作为等于时其两边都必须加空格否则失效等号也是操作符必须和其他变量关键字用空格格开 (等号做赋值号时正好相反两边不能有空格 [macgmachome ~]$ vi test.shecho input your choice:read varif [ $varyes ]thenecho $varecho input is correctelseecho $varecho input errorfi[macgmachome ~]$ vi test.shecho input your choice:read varif [ $var yes ] 在等号两边加空格thenecho $varecho input is correctelseecho $varecho input errorfi[macgmachome ~]$ sh test.shinput your choice:yyinput is correct[macgmachome ~]$ sh test.shinput your choice:n ninput is correct 输错了也走then,都走then,为什么?因为if把$varyes连读成一个变量而此变量为空返回1则走else [macgmachome ~]$ sh test.shinput your choice:yyinput error[macgmachome ~]$ sh test.shinput your choice:no noinput error一切正常 If [ $ANS ] 等价于 if [ -n $ANS ] 如果字符串变量非空then , 空(else) echo input your choice:read ANSif [ $ANS ]thenecho no emptyelseecho empthfi [macgmachome ~]$ sh test.shinput your choice: 回车 empth 说明“回车”就是空串[macgmachome ~]$ sh test.shinput your choice:34no empty 整数条件表达式大于小于shell里没有 和 ,会被当作尖括号只有-ge,-gt,-le,lt [macgmachome ~]$ vi test.shecho input a:read aif [ $a -ge 100 ] ; thenecho 3bitelseecho 2bitfi[macgmachome ~]$ sh test.shinput a:1233bit[macgmachome ~]$ sh test.shinput a:202bit 整数操作符号-ge,-gt,-le,-lt, 别忘了加- if test $a ge 100 ; then[macgmachome ~]$ sh test.shtest.sh: line 4: test: ge: binary operator expectedif test $a -ge 100 ; then[macgmachome ~]$ sh test.shinput a:1233bit 逻辑表达式 逻辑非 ! 条件表达式的相反if [ ! 表达式 ]if [ ! -d $num ] 如果不存在目录$num 逻辑与 –a 条件表达式的并列if [ 表达式1 –a 表达式2 ] 逻辑或 -o 条件表达式的或if [ 表达式1 –o 表达式2 ] 逻辑表达式 表达式与前面的 ! -d –f –x -ne -eq -lt等合用 逻辑符号就正常的接其他表达式没有任何括号 就是并列 if [ -z $JHHOME -a -d $HOME/$num ] 注意逻辑与-a与逻辑或-o很容易和其他字符串或文件的运算符号搞混了 最常见的赋值形式赋值前对两边的变量都进行评测左边测变量是否为空右边测目录(值)是否存在值是否有效 [macgmac-home ~]$ vi test.sh:echo input the num:read numecho input is $numif [ -z $JHHOME -a -d $HOME/$num ] 如果变量$JHHOME为空且$HOME/$num目录存在thenJHHOME$HOME/$num 则赋值fiecho JHHOME is $JHHOME -----------------------[macgmac-home ~]$ sh test.shinput the num:pppinput is pppJHHOME is目录-d $HOME/$num 不存在所以$JHHOME没被then赋值[macgmac-home ~]$ mkdir ppp[macgmac-home ~]$ sh test.shinput the num:pppinput is pppJHHOME is /home/macg/ppp 一个-o的例子其中却揭示了””必须两边留空格的问题 echo input your choice:read ANSif [ $ANSYes -o $ANSyes -o $ANSy -o $ANSY ]thenANSyelseANSnfiecho $ANS[macgmachome ~]$ sh test.shinput your choice:ny[macgmachome ~]$ sh test.shinput your choice:noy为什么输入不是yes,结果仍是y(走then因为被连读了成了变量$ANSYes而变量又为空所以走else了 [macgmachome ~]$ vi test.shecho input your choice:read ANS echo input your choice:read ANSif [ $ANS Yes -o $ANS yes -o $ANS y -o $ANS Y ]thenANSyelseANSnfiecho $ANS[macgmachome ~]$ sh test.shinput your choice:non[macgmachome ~]$ sh test.shinput your choice:yesy[macgmachome ~]$ sh test.shinput your choice:yy 以 test 条件表达式 作为if条件 if test $num -eq 0 等价于 if [ $num –eq 0 ] test 表达式,没有 [ ]if test $num -eq 0 thenecho try againelseecho goodfi man test [macgmachome ~]$ man test[(1) User Commands [(1)SYNOPSIS test EXPRESSION [ EXPRESSION ] [-n] STRING the length of STRING is nonzero -n和直接$str都是非0条件 -z STRING the length of STRING is zero STRING1 STRING2 the strings are equal STRING1 ! STRING2 the strings are not equal INTEGER1 -eq INTEGER2 INTEGER1 is equal to INTEGER2 INTEGER1 -ge INTEGER2 INTEGER1 is greater than or equal to INTEGER2 INTEGER1 -gt INTEGER2 INTEGER1 is greater than INTEGER2 INTEGER1 -le INTEGER2 INTEGER1 is less than or equal to INTEGER2 INTEGER1 -lt INTEGER2 INTEGER1 is less than INTEGER2 INTEGER1 -ne INTEGER2 INTEGER1 is not equal to INTEGER2 FILE1 -nt FILE2 FILE1 is newer (modification date) than FILE2 FILE1 -ot FILE2 FILE1 is older than FILE2 -b FILE FILE exists and is block special -c FILE FILE exists and is character special -d FILE FILE exists and is a directory -e FILE FILE exists 文件存在 -f FILE FILE exists and is a regular file 文件存在且是普通文件 -h FILE FILE exists and is a symbolic link (same as -L) -L FILE FILE exists and is a symbolic link (same as -h) -G FILE FILE exists and is owned by the effective group ID -O FILE FILE exists and is owned by the effective user ID -p FILE FILE exists and is a named pipe -s FILE FILE exists and has a size greater than zero -S FILE FILE exists and is a socket -w FILE FILE exists and is writable -x FILEFILE exists and is executable if简化语句 最常用的简化if语句 如果是“前面”则“后面”[ -f /var/run/dhcpd.pid ] rm /var/run/dhcpd.pid 检查 文件是否存在如果存在就删掉 || 如果不是“前面”则后面[ -f /usr/sbin/dhcpd ] || exit 0 检验文件是否存在如果存在就退出 用简化 if 和$1,$2,$3来检测参数不合理就调用help[ -z $1 ] help 如果第一个参数不存在-z 字符串长度为0 [ $1 -h ] help 如果第一个参数是-h,就显示help例子#!/bin/sh[ -f /etc/sysconfig/network-scripts/ifcfg-eth0 ] rm -f /etc/sysconfig/network-scripts/ifcfg-eth0cp ifcfg-eth0.bridge /etc/sysconfig/network-scripts/ifcfg-eth0[ -f /etc/sysconfig/network-scripts/ifcfg-eth1 ] rm -f /etc/sysconfig/network-scripts/ifcfg-eth1cp ifcfg-eth1.bridge /etc/sysconfig/network-scripts/ifcfg-eth1[ -f /etc/sysconfig/network-scripts/ifcfg-eth0:1 ] rm -f /etc/sysconfig/network-scripts/ifcfg-eth0:1 转载于:https://www.cnblogs.com/Sir-Li/p/4080811.html