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 a=1.5 2 3 let "b = $a + 1.3" # 错误. 4 # t2.sh: let: b = 1.5 + 1.3: 表达式的语法错误(错误标志为".5 + 1.3") 5 6 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"><<</SPAN></DT><DD><P>左移一位(每次左移都相当于乘以<TTCLASS="LITERAL">2</TT>)</P></DD><DT><SPANCLASS="TOKEN"><<=</SPAN></DT><DD><P><SPANCLASS="QUOTE">"左移-赋值"</SPAN></P><P><KBDCLASS="USERINPUT">let "var <<= 2"</KBD> 这句的结果就是变量<CODECLASS="VARNAME">var</CODE>左移<TTCLASS="LITERAL">2</TT>位(就是乘以<TTCLASS="LITERAL">4</TT>)</P></DD><DT><SPANCLASS="TOKEN">>></SPAN></DT><DD><P>右移一位(每次右移都将除以<TTCLASS="LITERAL">2</TT>)</P></DD><DT><SPANCLASS="TOKEN">>>=</SPAN></DT><DD><P><SPANCLASS="QUOTE">"右移-赋值"</SPAN> (与<SPANCLASS="TOKEN"><<=</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><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">&&</SPAN></DT><DD><P>与(逻辑)</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 if [ $condition1 ] && [ $condition2 ] 2 # 与 if [ $condition1 -a $condition2 ] 相同 3 # 如果condition1和condition2都为true, 那结果就为true. 4 5 if [[ $condition1 && $condition2 ]] # 也可以. 6 # 注意: &&不允许出现在[ ... ]结构中.</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">&&</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 if [ $condition1 ] || [ $condition2 ] 2 # 与 if [ $condition1 -o $condition2 ] 相同 3 # 如果condition1或condition2中的一个为true, 那么结果就为true. 4 5 if [[ $condition1 || $condition2 ]] # 也可以. 6 # 注意||操作符是不能够出现在[ ... ]结构中的. </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. 使用&&和||进行混合条件测试</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 3 a=24 4 b=47 5 6 if [ "$a" -eq 24 ] && [ "$b" -eq 47 ] 7 then 8 echo "Test #1 succeeds." 9 else 10 echo "Test #1 fails." 11 fi 12 13 # ERROR: if [ "$a" -eq 24 && "$b" -eq 47 ] 14 #+ 尝试运行' [ "$a" -eq 24 ' 15 #+ 因为没找到匹配的']'所以失败了. 16 # 17 # 注意: if [[ $a -eq 24 && $b -eq 24 ]] 也能正常运行. 18 # 双中括号的if-test结构要比 19 #+ 单中括号的if-test结构更加灵活. 20 # (在第17行"&&"与第6行的"&&"具有不同的含义.) 21 # 感谢, Stephane Chazelas, 指出这点. 22 23 24 if [ "$a" -eq 98 ] || [ "$b" -eq 47 ] 25 then 26 echo "Test #2 succeeds." 27 else 28 echo "Test #2 fails." 29 fi 30 31 32 # -a和-o选项提供了 33 #+ 一种可选的混合条件测试的方法. 34 # 感谢Patrick Callahan指出这点. 35 36 37 if [ "$a" -eq 24 -a "$b" -eq 47 ] 38 then 39 echo "Test #3 succeeds." 40 else 41 echo "Test #3 fails." 42 fi 43 44 45 if [ "$a" -eq 98 -o "$b" -eq 47 ] 46 then 47 echo "Test #4 succeeds." 48 else 49 echo "Test #4 fails." 50 fi 51 52 53 a=rhino 54 b=crocodile 55 if [ "$a" = rhino ] && [ "$b" = crocodile ] 56 then 57 echo "Test #5 succeeds." 58 else 59 echo "Test #5 fails." 60 fi 61 62 exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><P><SPANCLASS="TOKEN">&&</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 && 2 )) $((3 && 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 let "t1 = ((5 + 3, 7 - 1, 15 - 4))" 2 echo "t1 = $t1" # t1 = 11 3 4 let "t2 = ((a = 9, 15 / 3))" # 设置"a"并且计算"t2". 5 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 + -
显示快捷键?