<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://www.gentoo-zh.org/extern.php?action=feed&amp;tid=515&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[Gentoo中文社区 / if条件判断]]></title>
		<link>https://www.gentoo-zh.org/viewtopic.php?id=515</link>
		<description><![CDATA[if条件判断 最近发表的帖子。]]></description>
		<lastBuildDate>Sun, 13 Nov 2022 09:49:24 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[if条件判断]]></title>
			<link>https://www.gentoo-zh.org/viewtopic.php?pid=552#p552</link>
			<description><![CDATA[<p>if 语句格式<br />if&#160; 条件<br />then<br /> Command<br />else<br /> Command<br />fi </p><p> if 的三种条件表达式<br />if<br />command<br />then<br />if<br /> 函数<br />then<br />命令执行成功，等于返回0 （比如grep ,找到匹配）<br />执行失败，返回非0 （grep,没找到匹配）</p><p>if [ expression_r_r_r&#160; ]<br />then <br />表达式结果为真，则返回0，if把0值引向then </p><p>&#160; [ ] &amp;&amp;&#160; ——快捷if<br />[ -f &quot;/etc/shadow&quot; ] &amp;&amp; echo &quot;This computer uses shadow passwors&quot;<br />&amp;&amp; 可以理解为then&#160; &#160; 如果左边的表达式为真则执行右边的语句</p><p>shell的if与c语言if的功能上的区别</p><p>shell if&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;|&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;c语言if <br />-------------------------------|------------------------------------<br />0为真，走then&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; |&#160; &#160; &#160; &#160; &#160; &#160; 正好相反，非0走then <br />-------------------------------|------------------------------------<br />不支持整数变量直接if&#160; &#160; &#160; &#160; &#160; &#160;|&#160; &#160; &#160; &#160; &#160; &#160; 支持整数变量直接if<br />必须:if [ i –ne 0 ]&#160; &#160; &#160; &#160; &#160; &#160; |<br />但支持字符串变量直接if&#160; &#160; &#160; &#160; &#160;|&#160; &#160; &#160; &#160; &#160; &#160; &#160;if (i )<br />if [ str ] 如果字符串非0&#160; &#160; &#160; &#160;|<br />支持变量直接if&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;|<br />&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</p><br /><br /><br /><p>=================================以command作为if 条件===================================<br />&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;以多条command或者函数作为if 条件<br />echo –n “input:”<br />read user<br />if<br />多条指令,这些命令之间相当于“and”（与）<br />grep $user /etc/passwd &gt;/tmp/null&#160; &#160; &#160; <br />who -u | grep $user<br />then&#160; &#160; &#160; &#160; &#160; &#160; &#160;上边的指令都执行成功,返回值$?为0，0为真，运行then<br /> echo &quot;$user has logged&quot;<br />else&#160; &#160; &#160;指令执行失败，$?为1，运行else&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; <br /> echo &quot;$user has not logged&quot;<br />fi&#160; &#160;</p><p>&#160; &#160; &#160;以函数作为if条件&#160; (函数就相当于command,函数的优点是其return值可以自定义)<br />&#160; &#160;if<br />以函数作为if条件，<br />getyn<br />then&#160; &#160;函数reture值0为真，走then<br />echo &quot; your answer is yes&quot;<br />else&#160; 函数return值非0为假，走else<br />echo &quot;your anser is no&quot;<br />fi&#160; </p><p>&#160; &#160; &#160; &#160; &#160; if command&#160; 等价于 command+if $?<br />（1）<br />$ vi testsh.sh<br />#!/bin/sh<br />if<br />cat 111-tmp.txt | grep ting1<br />then<br />echo found<br />else<br />echo &quot;no found&quot;<br />fi</p><p>（2）<br />$ vi testsh.sh<br />#!/bin/sh<br />cat 111-tmp.txt | grep ting1<br />if [ $? -eq 0 ]<br />then<br />echo $?<br />echo found<br />else<br />echo $?<br />echo &quot;no found&quot;<br />fi</p><p>========================================以条件表达式作为 if条件=============================<br />传统if 从句子——以条件表达式作为 if条件<br />if [ 条件表达式 ]<br />then<br /> command<br /> command<br /> command<br />else<br /> command<br /> command<br />fi<br />&#160; &#160;<br />&#160; &#160;条件表达式<br />?文件表达式<br />if [ -f&#160; file ]&#160; &#160; 如果文件存在<br />if [ -d ...&#160; &#160;]&#160; &#160; 如果目录存在<br />if [ -s file&#160; ]&#160; &#160; 如果文件存在且非空 <br />if [ -r file&#160; ]&#160; &#160; 如果文件存在且可读<br />if [ -w file&#160; ]&#160; &#160; 如果文件存在且可写<br />if [ -x file&#160; ]&#160; &#160; 如果文件存在且可执行&#160; &#160;<br />?整数变量表达式<br />if [ int1 -eq int2 ]&#160; &#160; 如果int1等于int2&#160; &#160;<br />if [ int1 -ne int2 ]&#160; &#160; 如果不等于&#160; &#160; <br />if [ int1 -ge int2 ]&#160; &#160; &#160; &#160;如果&gt;=<br />if [ int1 -gt int2 ]&#160; &#160; &#160; &#160;如果&gt;<br />if [ int1 -le int2 ]&#160; &#160; &#160; &#160;如果&lt;=<br />if [ int1 -lt int2 ]&#160; &#160; &#160; &#160;如果&lt;<br />&#160; &#160;<br />?&#160; &#160;字符串变量表达式<br />If&#160; [ $a = $b ]&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;如果string1等于string2<br />&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; 字符串允许使用赋值号做等号<br />if&#160; [ $string1 !=&#160; $string2 ]&#160; &#160;如果string1不等于string2&#160; &#160; &#160; &#160;<br />if&#160; [ -n $string&#160; ]&#160; &#160; &#160; &#160; &#160; &#160; &#160;如果string 非空(非0），返回0(true)&#160; <br />if&#160; [ -z $string&#160; ]&#160; &#160; &#160; &#160; &#160; &#160; &#160;如果string 为空<br />if&#160; [ $sting ]&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; 如果string 非空，返回0 (和-n类似)&#160; &#160; </p><p> -eq&#160; -ne&#160; -lt&#160; -nt只能用于整数，不适用于字符串，字符串等于用赋值号=<br /> =放在别的地方是赋值,放在if [ ] 里就是字符串等于,shell里面没有==的,那是c语言的等于<br /> 无空格的字符串，可以加&quot; &quot;,也可以不加</p><p>= 作为等于时，其两边都必须加空格，否则失效<br />等号也是操作符，必须和其他变量，关键字，用空格格开 (等号做赋值号时正好相反，两边不能有空格）<br />If&#160; [&#160; $ANS&#160; ]&#160; &#160; &#160;等价于&#160; if [ -n $ANS ]<br />如果字符串变量非空（then） , 空(else)<br />整数条件表达式，大于，小于，shell里没有&gt; 和&lt; ,会被当作尖括号，只有-ge,-gt,-le,lt<br /> 整数操作符号-ge,-gt,-le,-lt, 别忘了加-</p><p>============================逻辑表达式=========================================<br />逻辑非 !&#160; &#160;条件表达式的相反<br />if [ ! 表达式 ]<br />if [ ! -d $num ]&#160; 如果不存在目录$num<br />逻辑与 –a&#160; 条件表达式的并列<br />if [ 表达式1&#160; –a&#160; 表达式2 ]<br />逻辑或 -o&#160; &#160;条件表达式的或<br />if [ 表达式1&#160; –o 表达式2 ]&#160; &#160;<br />逻辑表达式<br />?&#160; &#160; 表达式与前面的=&#160; != -d –f –x -ne -eq -lt等合用<br />?&#160; &#160; 逻辑符号就正常的接其他表达式，没有任何括号（ ），就是并列<br />if [ -z &quot;$JHHOME&quot; -a -d $HOME/$num ]<br />?&#160; &#160; 注意逻辑与-a与逻辑或-o很容易和其他字符串或文件的运算符号搞混了</p><p>===================以&#160; test 条件表达式 作为if条件===================================<br />if test $num -eq 0 等价于&#160; &#160;if [ $num –eq 0 ]<br />&#160; &#160;test&#160; 表达式,没有 [&#160; ]<br />if test $num -eq 0&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; <br />then<br />echo &quot;try again&quot;<br />else<br />echo &quot;good&quot;<br />fi</p><p> ======================if简化语句=================================<br />最常用的简化if语句<br />&amp;&amp; 如果是“前面”，则“后面”<br />[ -f /var/run/dhcpd.pid ] &amp;&amp; rm /var/run/dhcpd.pid&#160; &#160; 检查 文件是否存在，如果存在就删掉 <br />&#160; &#160;||&#160; &#160;如果不是“前面”，则后面<br />[ -f /usr/sbin/dhcpd ] || exit 0&#160; &#160; 检验文件是否存在，如果存在就退出 <br /> 用简化 if 和$1,$2,$3来检测参数，不合理就调用help<br />[ -z &quot;$1&quot; ] &amp;&amp; help&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;如果第一个参数不存在（-z&#160; 字符串长度为0 ）<br />[ &quot;$1&quot; = &quot;-h&quot; ] &amp;&amp; help&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; 如果第一个参数是-h,就显示help</p>]]></description>
			<author><![CDATA[dummy@example.com (batsom)]]></author>
			<pubDate>Sun, 13 Nov 2022 09:49:24 +0000</pubDate>
			<guid>https://www.gentoo-zh.org/viewtopic.php?pid=552#p552</guid>
		</item>
	</channel>
</rss>
