问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

shell脚本中的if中多条件语句如何写。

发布网友 发布时间:2022-04-22 10:23

我来回答

7个回答

懂视网 时间:2022-05-11 00:51

if 语句格式
if 条件
then
Command
else
Command
fi 别忘了这个结尾
If语句忘了结尾fi
test.sh: line 14: syntax error: unexpected end of fi if 的三种条件表达式

if
command
then if
函数
then
命令执行成功,等于返回0 (比如grep ,找到匹配)
执行失败,返回非0 (grep,没找到匹配)
if [ expression_r_r_r ]
then 表达式结果为真,则返回0,if把0值引向then
if test expression_r_r_r
then 表达式结果为假,则返回非0,if把非0值引向then
[ ] && ——快捷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 条件

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

传统if 从句子——以条件表达式作为 if条件

if [ 条件表达式 ]
then
 command
 command
 command
else
 command
 command
fi

条件表达式


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
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:

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

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:

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

[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语句

&& 如果是“前面”,则“后面”

[ -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

更多Linux shell脚本编程if语句的使用方法(条件判断)相关文章请关注PHP中文网!

热心网友 时间:2022-05-10 21:59

可以使用 if-elif-else 语法来写多条件语句。

1、首先要理解if-else的基本用法,if条件+then操作+else操作+fi闭合,书写方法如下:

2、if -elif-else 语法的具体格式--if条件多分支,书写方法如下:

3、实例 - if单条件多分支,这个实例的输出结果是:a 小于 b。

4、实例 - if多条件多分支,这个实例输出结果是:a 等于 b,或 a小于10。

扩展资料

1、shell语法注意事项

shell的if语法和C语言等高级语言非常相似,唯一需要注意的地方就是shell的if语句对空格方面的要求比较严格,如果在需要空格的地方没有打上空格,就会报错。

如if [ 1 == 1 ];then echo "abc";fi中如果在少写了if后面的空格就报错:

2、 shell语法中[[ ]]和[ ]的主要区别

(1) [ ] 实际上是bash 中 test 命令的简写。即所有的 [ expr ] 等于 test expr。
对 test 命令来说, 用 -eq 要进行数字比较,而你此时传入字符串,就报错了。


(2) [[ ]] 是内置在shell中的一个命令,它比test强大的多。支持字符串的模式匹配(使用=~操作符时甚至支持shell的正则表达式)。逻辑组合可以不使用test的-a,-o而使用&& ||。

热心网友 时间:2022-05-10 23:17

1、首先要理解shell中if语句的用法才能更好的理解if多条件语句的写法,在shell中条件语句是“if-then”,if语句后面是一个命令执行结束的退出状态码是 0,则执行 then 部分的命令,否则then 不执行;fi是if的结束标志:


2、if语句的嵌套使用和其他语言基本一致,直接在if中继续使用if语句即可,嵌套的层数没有*,但最好不要过多的层数,这样会让代码显得比较混来,难以理解:

3、多个条件判断使用“if then-elif then”,这里和其他编程语言不同,最后可以加else也可以不加else:

热心网友 时间:2022-05-11 00:52

if [ $a = "aa" -a $b = "bb" ] || [$c = "cc" -a $d = "dd" ];
then
echo "success"
fi

热心网友 时间:2022-05-11 02:43

if [ $a = "aa" -a $b = "bb" ] || [$c = "cc" -a $d = "dd" ];
then
echo "success"
fi

是这个意思吗

热心网友 时间:2022-05-11 04:51

if [ [ $a == "aa" -a $b == "bb"] -o [ $c == "cc" -a $d == "dd" ] ]
then
echo "success"
else
echo "false"
fi
解释:shell中,支持==,也支持=。
==是比较,=是赋值。(看评论中的年限是16年的,或许18年的现在代码更新换代了吧)
-a 可以理解为and
-r 可以理解为or
if后面跟[],且与或非三种必须在[]中使用!

热心网友 时间:2022-05-11 07:16

success要用引号引起来(单引号、双引号都行),否则会被shell认为是一个变量。

其他没什么错误。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
深唐杯和大唐杯哪个含金量高 大唐杯有含金量吗 有时候晚上经常射精是怎么回事 做频繁春梦秒射是正常现象嘛 频繁梦中射精怎么回事 电饼铛上的油怎么去掉 除了口罩?疫情防护用品主要有哪些,特殊时期的病毒防护物品清单_百度... 医务人员基本防护用品三样 劳保用品的用处 中国哪些城市有飞迪拜 Linux shell if语句 如何在linux shell中if表达语句 linux shell的if语句 steam特别好评的七款恋爱养成游戏 单游吧恋爱游戏进不去 你认为在恋爱中谁会占主导地位,为什么? 从来不在朋友圈发自己照片的女生是什么性格? 恋爱游戏能玩吗? 404 Not Found 恋爱冒险游戏对恋爱经验有帮助吗? 为什么大家都喜欢恋与制作人? 玩了怎么造句 什么是恋爱游戏 为什么女生宁愿玩恋与制作人,也不在现实中找男友? 以前开发恋爱游戏的都没有火,为什么恋与制作人火了? 为什么女生宁肯氪金恋与制作人,也不在现实中找男友? 恋爱游戏的介绍 我加载了恋爱游戏有几个女主 恋爱游戏 恋爱游戏的问题 求linux shell 中if的写法 linux shell if语句中~是什么意思 UNIX/Linux shell脚本 if语句的几个案例 linux bshell if语句问题 linux shell脚本 if语句 怎么用 [:alpha::] linux脚本if语句linuxif脚本 linux shell if语句为什么会出现一下问题,怎么解决? Linux shell编程,这个命令if [ &quot;$pid&quot; ]; then...。什么时候if条件判断为true和false呢? linux下bash shell的if语句后多条命令 在linux shell中if语法的使用不知道错在哪里? shell编程,if,else之后怎么执行多条语句?只能用&&? linux shell编程 if语句无法判断变量是否相等 抖音48小时不在线会如何显示 专业UI设计师有哪些特点? 抖音在线时间超过多久就不显示了 抖音超过几小时显示昨天在线 什么是UI设计师 抖音超过多久显示昨天在线 UI设计师按照级别划分都有哪些? 抖音超过多少小时显示昨天在线