⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opprecedence.html

📁 Shall高级编程
💻 HTML
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><HTML><HEAD><TITLE>Operator Precedence</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+"><LINKREL="HOME"TITLE="Advanced Bash-Scripting Guide"HREF="index.html"><LINKREL="UP"TITLE="Miscellany"HREF="miscellany.html"><LINKREL="PREVIOUS"TITLE="Miscellany"HREF="miscellany.html"><LINKREL="NEXT"TITLE="Shell Wrappers"HREF="wrapper.html"><METAHTTP-EQUIV="Content-Style-Type"CONTENT="text/css"><LINKREL="stylesheet"HREF="common/kde-common.css"TYPE="text/css"><METAHTTP-EQUIV="Content-Type"CONTENT="text/html; charset=iso-8859-1"><METAHTTP-EQUIV="Content-Language"CONTENT="en"><LINKREL="stylesheet"HREF="common/kde-localised.css"TYPE="text/css"TITLE="KDE-English"><LINKREL="stylesheet"HREF="common/kde-default.css"TYPE="text/css"TITLE="KDE-Default"></HEAD><BODYCLASS="SECT1"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#AA0000"VLINK="#AA0055"ALINK="#AA0000"STYLE="font-family: sans-serif;"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">Advanced Bash-Scripting Guide: An in-depth exploration of the art of shell scripting</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="miscellany.html"ACCESSKEY="P">Prev</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">Chapter 33. Miscellany</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="wrapper.html"ACCESSKEY="N">Next</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="OPPRECEDENCE"></A>33.2. Operator Precedence</H1><P><ANAME="OPPRECEDENCE1"></A></P><P>        In a script, operations execute in order of        <ICLASS="FIRSTTERM">precedence</I>: the higher precedence operations	execute <SPANCLASS="emphasis"><ICLASS="EMPHASIS">before</I></SPAN> the lower precedence ones.	  <ANAME="AEN18381"HREF="#FTN.AEN18381">[1]</A>      </P><DIVCLASS="TABLE"><HR><ANAME="AEN18385"></A><P><B>Table 33-1. Operator Precedence</B></P><TABLEBORDER="1"CLASS="CALSTABLE"><THEAD><TR><THALIGN="LEFT"VALIGN="TOP">Operator</TH><THALIGN="LEFT"VALIGN="TOP">Meaning</TH><THALIGN="LEFT"VALIGN="TOP">Comments</TH></TR></THEAD><TBODY><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION"></TT></TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP"><BCLASS="COMMAND">HIGHEST PRECEDENCE</B></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">var++ var--</TT></TD><TDALIGN="LEFT"VALIGN="TOP">post-increment, post-decrement</TD><TDALIGN="LEFT"VALIGN="TOP"><AHREF="assortedtips.html#CSTYLE">C-style</A> operators</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">++var --var</TT></TD><TDALIGN="LEFT"VALIGN="TOP">pre-increment, pre-decrement</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">! ~</TT></TD><TDALIGN="LEFT"VALIGN="TOP"><AHREF="special-chars.html#NOTREF">negation</A></TD><TDALIGN="LEFT"VALIGN="TOP">logical / bitwise, inverts sense of following	        operator</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">**</TT></TD><TDALIGN="LEFT"VALIGN="TOP"><AHREF="operations.html#EXPONENTIATIONREF">exponentiation</A></TD><TDALIGN="LEFT"VALIGN="TOP"><AHREF="operations.html#AROPS1">arithmetic	        operation</A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">* / %</TT></TD><TDALIGN="LEFT"VALIGN="TOP">multiplication, division, modulo</TD><TDALIGN="LEFT"VALIGN="TOP">arithmetic operation</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">+ -</TT></TD><TDALIGN="LEFT"VALIGN="TOP">addition, subtraction</TD><TDALIGN="LEFT"VALIGN="TOP">arithmetic operation</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">&#60;&#60; &#62;&#62;</TT></TD><TDALIGN="LEFT"VALIGN="TOP">left, right shift</TD><TDALIGN="LEFT"VALIGN="TOP"><AHREF="operations.html#BITWSOPS1">bitwise</A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">-z -n</TT></TD><TDALIGN="LEFT"VALIGN="TOP"><ICLASS="FIRSTTERM">unary</I> comparison</TD><TDALIGN="LEFT"VALIGN="TOP">string is/is-not <ICLASS="FIRSTTERM">null</I></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">-e -f -t -x, etc.</TT></TD><TDALIGN="LEFT"VALIGN="TOP"><ICLASS="FIRSTTERM">unary</I> comparison</TD><TDALIGN="LEFT"VALIGN="TOP"><ICLASS="FIRSTTERM">files</I></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">&#60; -lt &#62; -gt &#60;= -le &#62;= -ge</TT></TD><TDALIGN="LEFT"VALIGN="TOP"><ICLASS="FIRSTTERM">compound</I> comparison</TD><TDALIGN="LEFT"VALIGN="TOP">string and integer</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">-nt -ot -ef</TT></TD><TDALIGN="LEFT"VALIGN="TOP"><ICLASS="FIRSTTERM">compound</I> comparison</TD><TDALIGN="LEFT"VALIGN="TOP"><ICLASS="FIRSTTERM">files</I></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">== -eq != -ne</TT></TD><TDALIGN="LEFT"VALIGN="TOP">equality / inequality</TD><TDALIGN="LEFT"VALIGN="TOP">test operators, string and integer</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">&#38;</TT></TD><TDALIGN="LEFT"VALIGN="TOP">AND</TD><TDALIGN="LEFT"VALIGN="TOP">bitwise</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">^</TT></TD><TDALIGN="LEFT"VALIGN="TOP">XOR</TD><TDALIGN="LEFT"VALIGN="TOP"><ICLASS="FIRSTTERM">exclusive</I> OR, bitwise</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">|</TT></TD><TDALIGN="LEFT"VALIGN="TOP">OR</TD><TDALIGN="LEFT"VALIGN="TOP">bitwise</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">&#38;&#38; -a</TT></TD><TDALIGN="LEFT"VALIGN="TOP">AND</TD><TDALIGN="LEFT"VALIGN="TOP">logical, <ICLASS="FIRSTTERM">compound</I>	        comparison</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">|| -o</TT></TD><TDALIGN="LEFT"VALIGN="TOP">OR</TD><TDALIGN="LEFT"VALIGN="TOP">logical, <ICLASS="FIRSTTERM">compound</I>	        comparison</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">?:</TT></TD><TDALIGN="LEFT"VALIGN="TOP"><AHREF="special-chars.html#CSTRINARY">trinary	        operator</A></TD><TDALIGN="LEFT"VALIGN="TOP">C-style</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">=</TT></TD><TDALIGN="LEFT"VALIGN="TOP"><AHREF="varassignment.html#EQREF">assignment</A></TD><TDALIGN="LEFT"VALIGN="TOP">(do not confuse with equality	        <ICLASS="FIRSTTERM">test</I>)</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">*= /= %= += -= &#60;&#60;= &#62;&#62;= &#38;= !=</TT></TD><TDALIGN="LEFT"VALIGN="TOP"><AHREF="operations.html#ARITHOPSCOMB">combination	        assignment</A></TD><TDALIGN="LEFT"VALIGN="TOP">times-equal, divide-equal, mod-equal, etc.</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">,</TT></TD><TDALIGN="LEFT"VALIGN="TOP"><AHREF="operations.html#COMMAOP">comma</A></TD><TDALIGN="LEFT"VALIGN="TOP">links a sequence of operations</TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION"></TT></TD><TDALIGN="LEFT"VALIGN="TOP">&nbsp;</TD><TDALIGN="LEFT"VALIGN="TOP"><BCLASS="COMMAND">LOWEST PRECEDENCE</B></TD></TR></TBODY></TABLE><HR></DIV><P>In practice, all you really need to remember is the      following:</P><UL><LI><P>The <SPANCLASS="QUOTE">"My Dear Aunt Sally"</SPAN> mantra (<SPANCLASS="emphasis"><ICLASS="EMPHASIS">multiply,	  divide, add, subtract</I></SPAN>) for the familiar <AHREF="operations.html#AROPS1">arithmetic operations</A>.</P></LI><LI><P>The <ICLASS="FIRSTTERM">compound</I> logical operators,	  <BCLASS="COMMAND">&#38;&#38;</B>, <BCLASS="COMMAND">||</B>, <BCLASS="COMMAND">-a</B>,	  and <BCLASS="COMMAND">-o</B> have low precedence.</P></LI><LI><P>The order of evaluation of equal-precedence operators is	  usually <ICLASS="FIRSTTERM">left-to-right</I>.</P></LI></UL><P>Now, let's utilize our knowledge of operator precedence to	  analyze a couple of lines from the	  <TTCLASS="FILENAME">/etc/init.d/functions file</TT>, as found in	  the <ICLASS="FIRSTTERM">Fedora Core</I> Linux distro.</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">   1&nbsp;while [ -n "$remaining" -a "$retry" -gt 0 ]; do   2&nbsp;   3&nbsp;# This looks rather daunting at first glance.   4&nbsp;   5&nbsp;   6&nbsp;# Separate the conditions:   7&nbsp;while [ -n "$remaining" -a "$retry" -gt 0 ]; do   8&nbsp;#       --condition 1-- ^^ --condition 2-   9&nbsp;  10&nbsp;#  If variable "$remaining" is not zero length  11&nbsp;#+      AND (-a)  12&nbsp;#+ variable "$retry" is greater-than zero  13&nbsp;#+ then  14&nbsp;#+ the [ expresion-within-condition-brackets ] returns success (0)  15&nbsp;#+ and the while-loop executes an iteration.  16&nbsp;#  ==============================================================  17&nbsp;#  Evaluate "condition 1" and "condition 2" ***before***  18&nbsp;#+ ANDing them. Why? Because the AND (-a) has a lower precedence  19&nbsp;#+ than the -n and -gt operators,  20&nbsp;#+ and therefore gets evaluated *last*.  21&nbsp;  22&nbsp;#################################################################  23&nbsp;  24&nbsp;if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then  25&nbsp;  26&nbsp;  27&nbsp;# Again, separate the conditions:  28&nbsp;if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then  29&nbsp;#    --condition 1--------- ^^ --condition 2-----  30&nbsp;  31&nbsp;#  If file "/etc/sysconfig/i18n" exists  32&nbsp;#+      AND (-a)  33&nbsp;#+ variable $NOLOCALE is zero length  34&nbsp;#+ then  35&nbsp;#+ the [ test-expresion-within-condition-brackets ] returns success (0)  36&nbsp;#+ and the commands following execute.  37&nbsp;#  38&nbsp;#  As before, the AND (-a) gets evaluated *last*  39&nbsp;#+ because it has the lowest precedence of the operators within  40&nbsp;#+ the test brackets.  41&nbsp;#  ==============================================================  42&nbsp;#  Note:  43&nbsp;#  ${NOLOCALE:-} is a parameter expansion that seems redundant.  44&nbsp;#  But, if $NOLOCALE has not been declared, it gets set to *null*,  45&nbsp;#+ in effect declaring it.  46&nbsp;#  This makes a difference in some contexts.</PRE></TD></TR></TABLE></P><DIVCLASS="TIP"><TABLECLASS="TIP"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="common/tip.png"HSPACE="5"ALT="Tip"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>To avoid confusion or error in a complex sequence of test        operators, break up the sequence into bracketed sections.      <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">   1&nbsp;if [ "$v1" -gt "$v2"  -o  "$v1" -lt "$v2"  -a  -e "$filename" ]   2&nbsp;# Unclear what's going on here...   3&nbsp;   4&nbsp;if [[ "$v1" -gt "$v2" ]] || [[ "$v1" -lt "$v2" ]] &#38;&#38; [[ -e "$filename" ]]   5&nbsp;# Much better -- the condition tests are grouped in logical sections.</PRE></TD></TR></TABLE>      </P></TD></TR></TABLE></DIV></DIV><H3CLASS="FOOTNOTES">Notes</H3><TABLEBORDER="0"CLASS="FOOTNOTES"WIDTH="100%"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN18381"HREF="opprecedence.html#AEN18381">[1]</A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P><ICLASS="FIRSTTERM">Precedence</I>, in this context,	    has approximately the same meaning as	    <ICLASS="FIRSTTERM">priority</I></P></TD></TR></TABLE><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="miscellany.html"ACCESSKEY="P">Prev</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">Home</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="wrapper.html"ACCESSKEY="N">Next</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">Miscellany</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="miscellany.html"ACCESSKEY="U">Up</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">Shell Wrappers</TD></TR></TABLE></DIV></BODY></HTML>

⌨️ 快捷键说明

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