我的编程空间,编程开发者的网络收藏夹
学习永远不晚

shell if -z -f

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

shell if -z -f

if判断中常使用的shell选项

选项    含义
-eq    //等于
-ne    //不等于
-gt    //大于
-lt    //小于
-ge    //大于等于
-le    //小于等于
-z    判断变量是否存在值  //-z 在if里的意思是 空
-d    判断该选项后的参数是否为目录
-f    判断该选项后指定的参数是否为文件
-L    判断指定的是否为符号链接
-r    判断指定的是否可读
-s    判断存在的对象长度是否为0
-w    判断指定的是否可写
-x    判断存在的对象是否可以执行
-!    测试条件的否定符号


if [ str1 = str2 ]     当两个串有相同内容、长度时为真  
if [ str1 != str2 ]     当串str1和str2不等时为真  
if [ -n str1 ]        当串的长度大于0时为真(串非空)  
if [ -z str1 ]       当串的长度为0时为真(空串)  
if [ str1 ]         当串str1为非空时为真

shell 中利用 -n 来判定字符串非空。

错误用法:

ARGS=$*

if [ -n $ARGS  ]

then

   print "with argument"

fi

print " without argument"

不管传不传参数,总会进入if里面。

原因:因为不加“”时该if语句等效于if [ -n ],shell 会把它当成if [ str1 ]来处理,-n自然不为空,所以为正。

正确用法:需要在$ARGS上加入双引号,即"$ARGS".
ARGS=$*

if [ -n "$ARGS"  ]

then

   print "with argument"

fi

print " without argument"

=================================================================

shell脚本中的if 参数-a至-z

[-a file] 如果file存在则为真 

不过貌似有时候-a表示为and:条件与

[-b file] 如果file存在且是一个块特殊文件则为真 
[-c file] 如果file存在且是一个字特殊文件则为真 
[-d file] 如果file文件存在且是一个目录则为真 
-d前的!是逻辑非 
例如: 
if [ ! -d $lcd_path/$par_date ] 
表示后面的那个目录不存在,则执行后面的then操作 
[-e file] 如果file文件存在则为真 
[-f file] 如果file存在且是一个普通文件则为真 
[-g file] 如果file存在且已经设置了SGID则为真(SUID 是 Set User ID, SGID 是 Set Group ID的意思) 
[-h file] 如果file存在且是一个符号连接则为真 
[-k file] 如果file存在且已经设置粘制位则为真 
当一个目录被设置为"粘制位"(用chmod a+t),则该目录下的文件只能由 
一、超级管理员删除 
二、该目录的所有者删除 
三、该文件的所有者删除 
也就是说,即便该目录是任何人都可以写,但也只有文件的属主才可以删除文件。 
具体例子如下: 
#ls -dl /tmp 
drwxrwxrwt 4 root    root  ......... 
注意other位置的t,这便是粘连位。 
[-p file] 如果file存在且是一个名字管道(F如果O)则为真 
管道是linux里面进程间通信的一种方式,其他的还有像信号(signal)、信号量、消息队列、共享内存、套接字(socket)等。 
[-r file] 如果file存在且是可读的则为真 
[-s file] 如果file存在且大小不为0则为真 
[-t FD] 如果文件描述符FD打开且指向一个终端则为真 
[-u file] 如果file存在且设置了SUID(set userID)则为真 
[-w file] 如果file存在且是可写的则为真 
[-x file] 如果file存在且是可执行的则为真 
[-O file] 如果file存在且属有效用户ID则为真 
[-G file] 如果file存在且属有效用户组则为真 
[-L file] 如果file存在且是一个符号连接则为真 
[-N file] 如果file存在and has been mod如果ied since it was last read则为真 
[-S file] 如果file存在且是一个套接字则为真 
[file1 –nt file2] 如果file1 has been changed more recently than file2或者file1 exists and file2 does not则为真 
[file1 –ot file2] 如果file1比file2要老,或者file2存在且file1不存在则为真 
[file1 –ef file2] 如果file1和file2指向相同的设备和节点号则为真 
[-o optionname] 如果shell选项“optionname”开启则为真 
[-z string] “string”的长度为零则为真 
[-n string] or [string] “string”的长度为非零non-zero则为真 
[sting1==string2] 如果2个字符串相同。“=”may be used instead of “==”for strict posix compliance则为真 
[string1!=string2] 如果字符串不相等则为真 
[string1 [arg1 OP arg2] “OP”is one of –eq,-ne,-lt,-le,-gt or –ge.These arithmetic binary oprators return true if “arg1”is equal to,not equal to,less than,less than or equal
to,greater than,or greater than or equal to“agr2”,respectively.“arg1”and “agr2”are integers. 

================================

整数条件表达式,大于,小于,shell里没有> 和< ,会被当作尖括号,只有-ge,-gt,-le,lt

文本表达式比较常用:

  1. if [ -f file ] :如果文件存在
  2. if [ -d … ] :如果目录存在
  3. if [ -s file ] :如果文件存在且非空
  4. if [ -r file ] :如果文件存在且可读
  5. if [ -w file ] :如果文件存在且可写
  6. if [ -x file ] : 如果文件存在且可执行

逻辑表达式
逻辑非 !
非!:表示与条件表达式相反。 

if [ ! 表达式 ]

if [ ! -d $num ] :表示如果不存在目录$num

逻辑或 -o
表示条件表达式的或。

if [ 表达式1  –o 表达式2 ]

逻辑与 –a
表示条件表达式的与。

if [ 表达式1  –a  表达式2 ]

 ============================================================

 条件表达式

  • 文件表达式

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 equal
else
echo no equal
fi
[macg@machome ~]$ sh test.sh
input a:
5
input b:
5
no equal  (等于表达式没比较$a和$b,而是比较和a和b,自然a!=b)

改正:

if [ $a = $b ] ;then       
echo equal
else
echo no equal
fi
[macg@machome ~]$ sh test.sh
input a:
5
input b:
5
equal


                                                                                   
  -eq  -ne  -lt  -nt只能用于整数,不适用于字符串,字符串等于用赋值号=

[macg@machome ~]$ vi test.sh
echo -n "input your choice:"
read var
if  [ $var -eq "yes" ]
then
echo $var
fi
[macg@machome ~]$ sh -x test.sh
input your choice:
y
test.sh: line 3: test: y: integer expression_r_r_r expected
                       期望整数形式,即-eq不支持字符串




    =放在别的地方是赋值,放在if [ ] 里就是字符串等于,shell里面没有==的,那是c语言的等于


   无空格的字符串,可以加" ",也可以不加

[macg@machome ~]$ vi test.sh
echo "input a:"
read a
echo "input is $a"
if [ $a = 123 ] ; then
echo equal123
fi
[macg@machome ~]$ sh test.sh
input a:
123
input is 123
equal123 



    = 作为等于时,其两边都必须加空格,否则失效
等号也是操作符,必须和其他变量,关键字,用空格格开 (等号做赋值号时正好相反,两边不能有空格)

[macg@machome ~]$ vi test.sh

echo "input your choice:"
read var
if [ $var="yes" ]
then
echo $var
echo "input is correct"
else
echo $var
echo "input error"
fi
[macg@machome ~]$ vi test.sh

echo "input your choice:"
read var
if [ $var = "yes" ]   在等号两边加空格
then
echo $var
echo "input is correct"
else
echo $var
echo "input error"
fi
[macg@machome ~]$ sh test.sh
input your choice:
y
y
input is correct
[macg@machome ~]$ sh test.sh
input your choice:
n    
n
input is correct 
输错了也走then,都走then,为什么?
因为if把$var="yes"连读成一个变量,而此变量为空,返回1,则走else
 [macg@machome ~]$ sh test.sh
input your choice:
y
y
input error
[macg@machome ~]$ sh test.sh
input your choice:
no                       
no
input error
一切正常



    If  [  $ANS  ]     等价于  if [ -n $ANS ]
      如果字符串变量非空(then) , 空(else)

echo "input your choice:"
read ANS

if [ $ANS ]
then
echo no empty
else
echo empth
fi 
[macg@machome ~]$ sh test.sh
input your choice:                       回车
                                                
empth                                    说明“回车”就是空串
[macg@machome ~]$ sh test.sh
input your choice:
34
no empty 


 
    整数条件表达式,大于,小于,shell里没有> 和< ,会被当作尖括号,只有-ge,-gt,-le,lt

[macg@machome ~]$ vi test.sh

echo "input a:"
read a
if  [ $a -ge 100 ] ; then
echo 3bit
else
echo 2bit
fi
[macg@machome ~]$ sh test.sh
input a:
123
3bit
[macg@machome ~]$ sh test.sh
input a:
20
2bit



 整数操作符号-ge,-gt,-le,-lt, 别忘了加-

if  test $a  ge 100 ; then

[macg@machome ~]$ sh test.sh
test.sh: line 4: test: ge: binary operator expected
if  test $a -ge 100 ; then

[macg@machome ~]$ sh test.sh
input a:
123
3bit



============================逻辑表达式=========================================

    逻辑非 !                   条件表达式的相反
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很容易和其他字符串或文件的运算符号搞混了



  最常见的赋值形式,赋值前对=两边的变量都进行评测
左边测变量是否为空,右边测目录(值)是否存在(值是否有效)

[macg@mac-home ~]$ vi test.sh
:
echo "input the num:"
read num
echo "input is $num"

if [ -z "$JHHOME" -a -d $HOME/$num ]   如果变量$JHHOME为空,且$HOME/$num目录存在
then
JHHOME=$HOME/$num                      则赋值
fi

echo "JHHOME is $JHHOME"  
-----------------------
[macg@mac-home ~]$ sh test.sh
input the num:
ppp
input is ppp
JHHOME is

目录-d $HOME/$num   不存在,所以$JHHOME没被then赋值
[macg@mac-home ~]$ mkdir ppp
[macg@mac-home ~]$ sh test.sh
input the num:
ppp
input is ppp
JHHOME is /home/macg/ppp



    一个-o的例子,其中却揭示了”=”必须两边留空格的问题

echo "input your choice:"
read ANS

if [ $ANS="Yes" -o $ANS="yes" -o $ANS="y" -o $ANS="Y" ]
then
ANS="y"
else
ANS="n"
fi

echo $ANS
[macg@machome ~]$ sh test.sh
input your choice:
n
y
[macg@machome ~]$ sh test.sh
input your choice:
no
y
为什么输入不是yes,结果仍是y(走then)
因为=被连读了,成了变量$ANS="Yes",而变量又为空,所以走else了
[macg@machome ~]$ vi test.sh

echo "input your choice:"
read ANS    echo "input your choice:"
read ANS

if [ $ANS = "Yes" -o $ANS = "yes" -o $ANS = "y" -o $ANS = "Y" ]
then
ANS="y"
else
ANS="n"
fi

echo $ANS
[macg@machome ~]$ sh test.sh
input your choice:
no
n
[macg@machome ~]$ sh test.sh
input your choice:
yes
y
[macg@machome ~]$ sh test.sh
input your choice:
y
y



===================以  test 条件表达式 作为if条件===================================

    if test $num -eq 0      等价于   if [ $num –eq 0 ]

    test  表达式,没有 [  ]
if test $num -eq 0                
then
echo "try again"
else
echo "good"
fi

    man test

[macg@machome ~]$ 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 FILE
FILE 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-eth0
cp ifcfg-eth0.bridge /etc/sysconfig/network-scripts/ifcfg-eth0

[ -f "/etc/sysconfig/network-scripts/ifcfg-eth1" ] && rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
cp 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

===============================================

 [ ] &&  ——快捷if

[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"
   && 可以理解为then
    如果左边的表达式为真则执行右边的语句

 

    shell的if与c语言if的功能上的区别

 shell if    c语言if
0为真,走then 正好相反,非0走then
 不支持整数变量直接if
必须:if [ i –ne 0 ]

但支持字符串变量直接if
if [ str ] 如果字符串非0
 支持变量直接if
if (i )


 
=================================以command作为if 条件===================================
  
    以多条command或者函数作为if 条件

echo –n “input:”
read user

if
多条指令,这些命令之间相当于“and”(与)
grep $user /etc/passwd >/tmp/null      
who -u | grep $user
then             上边的指令都执行成功,返回值$?为0,0为真,运行then
 echo "$user has logged"
else     指令执行失败,$?为1,运行else                            
 echo "$user has not logged"
fi   
# sh test.sh
input : macg
macg     pts/0        May 15 15:55   .          2075 (192.168.1.100)
macg has logged
   
# sh test.sh
input : ddd
ddd has not logged  



    以函数作为if条件  (函数就相当于command,函数的优点是其return值可以自定义)

if
以函数作为if条件,
getyn
then   函数reture值0为真,走then
echo " your answer is yes"
else  函数return值非0为假,走else
echo "your anser is no"
fi  



   if command  等价于 command+if $?

$ vi testsh.sh
#!/bin/sh

if
cat 111-tmp.txt | grep ting1
then
echo found
else
echo "no found"
fi
 $ vi testsh.sh
#!/bin/sh

cat 111-tmp.txt | grep ting1

if [ $? -eq 0 ]
then
echo $?
echo found
else
echo $?
echo "no found"
fi
$ sh testsh.sh
no found  
$ sh testsh.sh
1
no found
$ vi 111-tmp.txt
that is 222file
thisting1 is 111file

$ sh testsh.sh
thisting1 is 111file
found
$ vi 111-tmp.txt
that is 222file
thisting1 is 111file

$ sh testsh.sh
thisting1 is 111file
0
found

来源地址:https://blog.csdn.net/phone1126/article/details/126365546

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

shell if -z -f

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

2023-09-11

Python的语法及if、while、f

1.  学习python特殊的缩进和语法    Python之所以如此简单,归功于他的缩进机制,严格的缩进机制使得代码非常整齐规范,赏心悦目,提高了可读性,在一定意义上提高了可维护性。python并不像其他语言那样要求什么{},仅仅使用ta
2023-01-31

Linux shell条件判断if中的-a到-z的意思【推荐】

[ -a FILE ] 如果 FILE 存在则为真。 [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。 [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。 [ -d FILE ] 如果 FILE 存
2022-06-04

怎么在Linux中使用shell条件判断if中的-a到-z

本篇文章为大家展示了怎么在Linux中使用shell条件判断if中的-a到-z,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。[ -a FILE ] 如果 FILE 存在则为真。[ -b FILE ]
2023-06-09

python学习笔记3—流程控制if、f

流程控制ifif 语句if expression:    statement(s)elseelse语句:if 语句,else语句if expression:    statement(s)else:    statement(s)elif语
2023-01-31

shell if 如何取非

在Shell脚本中,可以使用`!`操作符来取非。具体语法如下:```shellif ! condition; then# code to be executed if the condition is falseelse# code to
2023-08-08

shell脚本[] [[]] -n -z 的含义是什么

这篇文章将为大家详细讲解有关shell脚本[] [[]] -n -z 的含义是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在写脚本的时候,总是搞不懂[] [[]]的区别,这次写一个总结,把它掌握牢固
2023-06-09

shell中if test使用详解

目录1、数值1.1、数值大小比较1.2、数据值运算2、字符串2.1、示例1:字符串是否相等2.2、示例2:字符串为空3、文件判断4、逻辑运算5、if elif else1、数值 1.1、数值大小比较 参数说明-eq等于则为真-ne不等于则为
2023-06-09

Shell脚本if else语句小结

和Java、PHP等语言不一样,sh的流程控制不可为空,如:在sh/bash里可不能这么写,如果else分支没有语句执行,
2022-06-04

基于shell的if和else详解

基本语法 shell的if语法和C语言等高级语言非常相似,唯一需要注意的地方就是shell的if语句对空格方面的要求比较严格(其实shell对所有语法的空格使用都比较严格),如果在需要空格的地方没有打上空格,都会报错。如if [ $1x =
2022-06-04

Linux SHELL if命令参数说明

* -b 当file存在并且是块文件时返回真 * -c 当file存在并且是字符文件时返回真 * -d 当pathname存在并且是一个目录时返回真 * -e 当pathname指定的文件或目录存在时返回真 * -f 当file存在并且是正
2022-06-04

linux shell中if的各种判断

shell编程中使用到得if语句内判断参数–b当file存在并且是块文件时返回真 -c当file存在并且是字符文件时返回真 -d当pathname存在并且是一个目录时返回真 -e当pathname指定的文件或目录存在时返回真 -f当file
2022-06-04

详解shell脚本[] [[]] -n -z 的含义解析

在写脚本的时候,总是搞不懂[] [[]]的区别,这次写一个总结,把它掌握牢固 []和test 两者是一样的,在命令行里test expr和[ expr ]的效果相同。 test的三个基本作用是判断文件、判断字符串、判断整数。支持使用 ”与或
2022-06-04

shell中if和else的示例分析

这篇文章主要为大家展示了“shell中if和else的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“shell中if和else的示例分析”这篇文章吧。基本语法shell的if语法和C语言
2023-06-09

shell中的if语句怎么应用

在shell脚本中,可以使用if语句来进行条件判断和控制流程。if语句的一般格式如下:```shellif conditionthen# 如果条件为真,则执行这里的代码else# 如果条件为假,则执行这里的代码fi````condition
2023-09-25

shell if取非的方法是什么

在Shell脚本中,可以使用`!`运算符来进行取非操作。以下是一个示例:```shell#!/bin/bashflag=trueif ! $flag; thenecho "Flag is false"elseecho "Flag is tr
2023-08-08

Linux SHELL if命令参数的说明

本篇内容主要讲解“Linux SHELL if命令参数的说明”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux SHELL if命令参数的说明”吧!* -b 当file存在并且是块文件时返
2023-06-09

shell if判断语句实例分析

今天小编给大家分享一下shell if判断语句实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。UNIX Shell 里
2023-06-27

如何在Shell中使用if else语句

如何在Shell中使用if else语句?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。if 语句最简单的用法就是只使用 if 语句,它的语法格式为:if conditionth
2023-06-06

编程热搜

目录