ops.html

来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 1,274 行 · 第 1/2 页

HTML
1,274
字号
></TD></TR></TABLE>	</P><P>在2.05b版本之后, Bash开始支持64位整型了.</P></TD></TR></TABLE></DIV><DIVCLASS="CAUTION"><P></P><TABLECLASS="CAUTION"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/caution.gif"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>Bash不能够处理浮点运算. 			它会把包含小数点的数字看作字符串.        <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;a=1.5  2&nbsp;  3&nbsp;let "b = $a + 1.3"  # 错误.  4&nbsp;# t2.sh: let: b = 1.5 + 1.3: 表达式的语法错误(错误标志为".5 + 1.3")  5&nbsp;  6&nbsp;echo "b = $b"       # b=1</PRE></FONT></TD></TR></TABLE>		如果非要做浮点运算的话, 可以在脚本中使用<AHREF="mathc.html#BCREF">bc</A>, 		这个命令可以进行浮点运算, 或者调用数学库函数. </P></TD></TR></TABLE></DIV><DIVCLASS="FORMALPARA"><P><B>位操作符. </B>位操作符在shell脚本中很少被使用, 		  它们最主要的用途就是操作和测试从端口或者<AHREF="devref1.html#SOCKETREF">sockets</A>中读取的值. 		  位翻转<SPANCLASS="QUOTE">"Bit flipping"</SPAN>与编译语言的联系很紧密, 		  比如C/C++, 在这种语言中它可以运行的足够快. </P></DIV><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="BITWSOPS1"></A>位操作符</B></P><DL><DT><SPANCLASS="TOKEN">&#60;&#60;</SPAN></DT><DD><P>左移一位(每次左移都相当于乘以<TTCLASS="LITERAL">2</TT>)</P></DD><DT><SPANCLASS="TOKEN">&#60;&#60;=</SPAN></DT><DD><P><SPANCLASS="QUOTE">"左移-赋值"</SPAN></P><P><KBDCLASS="USERINPUT">let "var &#60;&#60;= 2"</KBD> 			  这句的结果就是变量<CODECLASS="VARNAME">var</CODE>左移<TTCLASS="LITERAL">2</TT>位(就是乘以<TTCLASS="LITERAL">4</TT>)</P></DD><DT><SPANCLASS="TOKEN">&#62;&#62;</SPAN></DT><DD><P>右移一位(每次右移都将除以<TTCLASS="LITERAL">2</TT>)</P></DD><DT><SPANCLASS="TOKEN">&#62;&#62;=</SPAN></DT><DD><P><SPANCLASS="QUOTE">"右移-赋值"</SPAN> (与<SPANCLASS="TOKEN">&#60;&#60;=</SPAN>正好相反)</P></DD><DT><SPANCLASS="TOKEN">&#38;</SPAN></DT><DD><P>按位与</P></DD><DT><SPANCLASS="TOKEN">&#38;=</SPAN></DT><DD><P><SPANCLASS="QUOTE">"按位与-赋值"</SPAN></P></DD><DT><SPANCLASS="TOKEN">|</SPAN></DT><DD><P>按位或</P></DD><DT><SPANCLASS="TOKEN">|=</SPAN></DT><DD><P><SPANCLASS="QUOTE">"按位或-赋值"</SPAN></P></DD><DT><SPANCLASS="TOKEN">~</SPAN></DT><DD><P>按位反</P></DD><DT><SPANCLASS="TOKEN">!</SPAN></DT><DD><P>按位非</P></DD><DT><SPANCLASS="TOKEN">^</SPAN></DT><DD><P>按位异或XOR</P></DD><DT><SPANCLASS="TOKEN">^=</SPAN></DT><DD><P><SPANCLASS="QUOTE">"按位异或-赋值"</SPAN></P></DD></DL></DIV><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="LOGOPS1"></A>逻辑操作符</B></P><DL><DT><SPANCLASS="TOKEN">&#38;&#38;</SPAN></DT><DD><P>与(逻辑)</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;if [ $condition1 ] &#38;&#38; [ $condition2 ]  2&nbsp;# 与 if [ $condition1 -a $condition2 ] 相同  3&nbsp;# 如果condition1和condition2都为true, 那结果就为true.   4&nbsp;  5&nbsp;if [[ $condition1 &#38;&#38; $condition2 ]]    # 也可以.  6&nbsp;# 注意: &#38;&#38;不允许出现在[ ... ]结构中.</PRE></FONT></TD></TR></TABLE></P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P><SPANCLASS="TOKEN">&#38;&#38;</SPAN>也可以用在<AHREF="list-cons.html#LISTCONSREF">与列表</A>中, 			  但是使用在连接命令中时, 需要依赖于具体的上下文. </P></TD></TR></TABLE></DIV></DD><DT><ANAME="ORREF"></A><SPANCLASS="TOKEN">||</SPAN></DT><DD><P>或(逻辑)</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;if [ $condition1 ] || [ $condition2 ]  2&nbsp;# 与 if [ $condition1 -o $condition2 ] 相同  3&nbsp;# 如果condition1或condition2中的一个为true, 那么结果就为true.   4&nbsp;  5&nbsp;if [[ $condition1 || $condition2 ]]    # 也可以.  6&nbsp;# 注意||操作符是不能够出现在[ ... ]结构中的. </PRE></FONT></TD></TR></TABLE></P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>Bash将会测试每个表达式的<AHREF="exit-status.html#EXITSTATUSREF">退出状态码</A>, 这些表达式由逻辑操作符连接起来. </P></TD></TR></TABLE></DIV><DIVCLASS="EXAMPLE"><HR><ANAME="ANDOR"></A><P><B>例子 8-3. 使用&#38;&#38;和||进行混合条件测试</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;  3&nbsp;a=24  4&nbsp;b=47  5&nbsp;  6&nbsp;if [ "$a" -eq 24 ] &#38;&#38; [ "$b" -eq 47 ]  7&nbsp;then  8&nbsp;  echo "Test #1 succeeds."  9&nbsp;else 10&nbsp;  echo "Test #1 fails." 11&nbsp;fi 12&nbsp; 13&nbsp;# ERROR:   if [ "$a" -eq 24 &#38;&#38; "$b" -eq 47 ] 14&nbsp;#+         尝试运行' [ "$a" -eq 24 ' 15&nbsp;#+         因为没找到匹配的']'所以失败了. 16&nbsp;# 17&nbsp;#  注意:  if [[ $a -eq 24 &#38;&#38; $b -eq 24 ]]  也能正常运行. 18&nbsp;#  双中括号的if-test结构要比 19&nbsp;#+ 单中括号的if-test结构更加灵活. 20&nbsp;#    (在第17行"&#38;&#38;"与第6行的"&#38;&#38;"具有不同的含义.) 21&nbsp;#    感谢, Stephane Chazelas, 指出这点. 22&nbsp; 23&nbsp; 24&nbsp;if [ "$a" -eq 98 ] || [ "$b" -eq 47 ] 25&nbsp;then 26&nbsp;  echo "Test #2 succeeds." 27&nbsp;else 28&nbsp;  echo "Test #2 fails." 29&nbsp;fi 30&nbsp; 31&nbsp; 32&nbsp;#  -a和-o选项提供了 33&nbsp;#+ 一种可选的混合条件测试的方法. 34&nbsp;#  感谢Patrick Callahan指出这点.  35&nbsp; 36&nbsp; 37&nbsp;if [ "$a" -eq 24 -a "$b" -eq 47 ] 38&nbsp;then 39&nbsp;  echo "Test #3 succeeds." 40&nbsp;else 41&nbsp;  echo "Test #3 fails." 42&nbsp;fi 43&nbsp; 44&nbsp; 45&nbsp;if [ "$a" -eq 98 -o "$b" -eq 47 ] 46&nbsp;then 47&nbsp;  echo "Test #4 succeeds." 48&nbsp;else 49&nbsp;  echo "Test #4 fails." 50&nbsp;fi 51&nbsp; 52&nbsp; 53&nbsp;a=rhino 54&nbsp;b=crocodile 55&nbsp;if [ "$a" = rhino ] &#38;&#38; [ "$b" = crocodile ] 56&nbsp;then 57&nbsp;  echo "Test #5 succeeds." 58&nbsp;else 59&nbsp;  echo "Test #5 fails." 60&nbsp;fi 61&nbsp; 62&nbsp;exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><P><SPANCLASS="TOKEN">&#38;&#38;</SPAN>和<SPANCLASS="TOKEN">||</SPAN>操作符也可以用在算术上下文中. </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $(( 1 &#38;&#38; 2 )) $((3 &#38;&#38; 0)) $((4 || 0)) $((0 || 0))</KBD><SAMPCLASS="COMPUTEROUTPUT">1 0 1 0</SAMP>	      </PRE></FONT></TD></TR></TABLE>	    </P></DD></DL></DIV><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="MISCOP1"></A>混杂的操作符</B></P><DL><DT><ANAME="COMMAOP"></A><SPANCLASS="TOKEN">,</SPAN></DT><DD><P>逗号操作符</P><P><BCLASS="COMMAND">逗号操作符</B>可以连接两个或多个算术运算. 	      所有的操作都会被运行(可能会有<EM>负作用</EM>),	      但是只会返回最后操作的结果. </P><P>	     <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;let "t1 = ((5 + 3, 7 - 1, 15 - 4))"  2&nbsp;echo "t1 = $t1"               # t1 = 11  3&nbsp;  4&nbsp;let "t2 = ((a = 9, 15 / 3))"  # 设置"a"并且计算"t2".  5&nbsp;echo "t2 = $t2    a = $a"     # t2 = 5    a = 9</PRE></FONT></TD></TR></TABLE>	     </P><P>逗号操作符主要用在<AHREF="loops1.html#FORLOOPREF1">for循环</A>中. 参见<AHREF="loops1.html#FORLOOPC">例子 10-12</A>.</P></DD></DL></DIV></DIV><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="operations.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">首页</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="numerical-constants.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">操作符与相关主题</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="operations.html"ACCESSKEY="U">上一级</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">数字常量</TD></TR></TABLE></DIV></BODY></HTML>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?