📄 opprecedence.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"> </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"> </TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </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"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </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"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION"><< >></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"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </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">< -lt > -gt <= -le >= -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"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">&</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"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"><TTCLASS="OPTION">&& -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"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </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">*= /= %= += -= <<= >>= &= !=</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"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </TD><TDALIGN="LEFT"VALIGN="TOP"> </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"> </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">&&</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 while [ -n "$remaining" -a "$retry" -gt 0 ]; do 2 3 # This looks rather daunting at first glance. 4 5 6 # Separate the conditions: 7 while [ -n "$remaining" -a "$retry" -gt 0 ]; do 8 # --condition 1-- ^^ --condition 2- 9 10 # If variable "$remaining" is not zero length 11 #+ AND (-a) 12 #+ variable "$retry" is greater-than zero 13 #+ then 14 #+ the [ expresion-within-condition-brackets ] returns success (0) 15 #+ and the while-loop executes an iteration. 16 # ============================================================== 17 # Evaluate "condition 1" and "condition 2" ***before*** 18 #+ ANDing them. Why? Because the AND (-a) has a lower precedence 19 #+ than the -n and -gt operators, 20 #+ and therefore gets evaluated *last*. 21 22 ################################################################# 23 24 if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then 25 26 27 # Again, separate the conditions: 28 if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then 29 # --condition 1--------- ^^ --condition 2----- 30 31 # If file "/etc/sysconfig/i18n" exists 32 #+ AND (-a) 33 #+ variable $NOLOCALE is zero length 34 #+ then 35 #+ the [ test-expresion-within-condition-brackets ] returns success (0) 36 #+ and the commands following execute. 37 # 38 # As before, the AND (-a) gets evaluated *last* 39 #+ because it has the lowest precedence of the operators within 40 #+ the test brackets. 41 # ============================================================== 42 # Note: 43 # ${NOLOCALE:-} is a parameter expansion that seems redundant. 44 # But, if $NOLOCALE has not been declared, it gets set to *null*, 45 #+ in effect declaring it. 46 # 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 if [ "$v1" -gt "$v2" -o "$v1" -lt "$v2" -a -e "$filename" ] 2 # Unclear what's going on here... 3 4 if [[ "$v1" -gt "$v2" ]] || [[ "$v1" -lt "$v2" ]] && [[ -e "$filename" ]] 5 # 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 + -