internal.html

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

HTML
3,324
字号
><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">type -a echo</KBD><SAMPCLASS="COMPUTEROUTPUT">echo is a shell builtin echo is /bin/echo</SAMP>	      </PRE></FONT></TD></TR></TABLE>	  </P></TD></TR></TABLE></DIV></DD><DT><ANAME="PRINTFREF"></A><BCLASS="COMMAND">printf</B></DT><DD><P><BCLASS="COMMAND">printf</B>命令, 格式化输出, 是<BCLASS="COMMAND">echo</B>命令的增强版. 			  它是C语言<CODECLASS="FUNCTION">printf()</CODE>库函数的一个有限的变形, 			  并且在语法上有些不同.</P><P><BCLASS="COMMAND">printf</B>   <TTCLASS="REPLACEABLE"><I>format-string</I></TT>...   <TTCLASS="REPLACEABLE"><I>parameter</I></TT>... </P><P>这是Bash的内建版本,  			与<TTCLASS="FILENAME">/bin/printf</TT>或者<TTCLASS="FILENAME">/usr/bin/printf</TT>命令不同. 			如果想更深入的了解, 请察看<BCLASS="COMMAND">printf</B>(系统命令)的man页. 		</P><DIVCLASS="CAUTION"><P></P><TABLECLASS="CAUTION"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/caution.gif"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>老版本的Bash可能不支持<BCLASS="COMMAND">printf</B>.</P></TD></TR></TABLE></DIV><DIVCLASS="EXAMPLE"><HR><ANAME="EX47"></A><P><B>例子 11-2. 使用<BCLASS="COMMAND">printf</B>的例子</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# printf 示例  3&nbsp;  4&nbsp;PI=3.14159265358979  5&nbsp;DecimalConstant=31373  6&nbsp;Message1="Greetings,"  7&nbsp;Message2="Earthling."  8&nbsp;  9&nbsp;echo 10&nbsp; 11&nbsp;printf "Pi to 2 decimal places = %1.2f" $PI 12&nbsp;echo 13&nbsp;printf "Pi to 9 decimal places = %1.9f" $PI  # 都能够正确的结束. 14&nbsp; 15&nbsp;printf "\n"                                  # 打印一个换行, 16&nbsp;                                             # 等价于 'echo' . . . 17&nbsp; 18&nbsp;printf "Constant = \t%d\n" $DecimalConstant  # 插入一个 tab (\t). 19&nbsp; 20&nbsp;printf "%s %s \n" $Message1 $Message2 21&nbsp; 22&nbsp;echo 23&nbsp; 24&nbsp;# ==========================================# 25&nbsp;# 模拟C函数, sprintf(). 26&nbsp;# 使用一个格式化的字符串来加载一个变量. 27&nbsp; 28&nbsp;echo  29&nbsp; 30&nbsp;Pi12=$(printf "%1.12f" $PI) 31&nbsp;echo "Pi to 12 decimal places = $Pi12" 32&nbsp; 33&nbsp;Msg=`printf "%s %s \n" $Message1 $Message2` 34&nbsp;echo $Msg; echo $Msg 35&nbsp; 36&nbsp;#  像我们所看到的一样, 现在'sprintf'可以 37&nbsp;#+ 作为一个可被加载的模块, 38&nbsp;#+ 但是不具可移植性. 39&nbsp; 40&nbsp;exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><P>使用<BCLASS="COMMAND">printf</B>的最主要的应用就是格式化错误消息. </P><P>	        <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;E_BADDIR=65  2&nbsp;  3&nbsp;var=nonexistent_directory  4&nbsp;  5&nbsp;error()  6&nbsp;{  7&nbsp;  printf "$@" &#62;&#38;2  8&nbsp;  # 格式化传递进来的位置参数, 并把它们送到stderr.  9&nbsp;  echo 10&nbsp;  exit $E_BADDIR 11&nbsp;} 12&nbsp; 13&nbsp;cd $var || error $"Can't cd to %s." "$var" 14&nbsp; 15&nbsp;# 感谢, S.C.</PRE></FONT></TD></TR></TABLE>            </P></DD><DT><ANAME="READREF"></A><BCLASS="COMMAND">read</B></DT><DD><P>从<TTCLASS="FILENAME">stdin</TT>中<SPANCLASS="QUOTE">"读取"</SPAN>一个变量的值, 	    也就是, 和键盘进行交互, 来取得变量的值.	    使用<CODECLASS="OPTION">-a</CODE>参数可以<BCLASS="COMMAND">read</B>数组变量(参考<AHREF="arrays.html#EX67">例子 26-6</A>).</P><DIVCLASS="EXAMPLE"><HR><ANAME="EX36"></A><P><B>例子 11-3. 使用<BCLASS="COMMAND">read</B>来进行变量分配</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# "Reading" 变量.  3&nbsp;  4&nbsp;echo -n "Enter the value of variable 'var1': "  5&nbsp;# -n 选项, 阻止换行.  6&nbsp;  7&nbsp;read var1  8&nbsp;# 注意: 在var1前面没有'$', 因为变量正在被设置.   9&nbsp; 10&nbsp;echo "var1 = $var1" 11&nbsp; 12&nbsp; 13&nbsp;echo 14&nbsp; 15&nbsp;# 一个单独的'read'语句可以设置多个变量.  16&nbsp;echo -n "Enter the values of variables 'var2' and 'var3' (separated by a space or tab): " 17&nbsp;read var2 var3 18&nbsp;echo "var2 = $var2      var3 = $var3" 19&nbsp;# 如果你只输入了一个值, 那么其他的变量还是处于未设置状态(null).  20&nbsp; 21&nbsp;exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><P>一个不带变量参数的<BCLASS="COMMAND">read</B>命令, 	      将会把来自键盘的输入存入到专用变量<AHREF="internalvariables.html#REPLYREF">$REPLY</A>中. </P><DIVCLASS="EXAMPLE"><HR><ANAME="READNOVAR"></A><P><B>例子 11-4. 当使用一个不带变量参数的<BCLASS="COMMAND">read</B>命令时, 将会发生什么? </B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# read-novar.sh  3&nbsp;  4&nbsp;echo  5&nbsp;  6&nbsp;# -------------------------- #  7&nbsp;echo -n "Enter a value: "  8&nbsp;read var  9&nbsp;echo "\"var\" = "$var"" 10&nbsp;# 到这里为止, 都与期望的一样. 11&nbsp;# -------------------------- # 12&nbsp; 13&nbsp;echo 14&nbsp; 15&nbsp;# ------------------------------------------------------------------- # 16&nbsp;echo -n "Enter another value: " 17&nbsp;read           #  没有变量分配给'read'命令, 所以... 18&nbsp;               #+ 输入将分配给默认变量, $REPLY. 19&nbsp;var="$REPLY" 20&nbsp;echo "\"var\" = "$var"" 21&nbsp;# 这部分代码和上边的代码等价. 22&nbsp;# ------------------------------------------------------------------- # 23&nbsp; 24&nbsp;echo 25&nbsp; 26&nbsp;exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><P>一般的, 当输入给<BCLASS="COMMAND">read</B>时, 			输入一个<KBDCLASS="USERINPUT">\</KBD>, 然后回车, 将会阻止产生一个新行. 	      <CODECLASS="OPTION">-r</CODE>选项将会让 <KBDCLASS="USERINPUT">\</KBD> 转义. </P><DIVCLASS="EXAMPLE"><HR><ANAME="READR"></A><P><B>例子 11-5. <BCLASS="COMMAND">read</B>命令的多行输入</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;  3&nbsp;echo  4&nbsp;  5&nbsp;echo "Enter a string terminated by a \\, then press &#60;ENTER&#62;."  6&nbsp;echo "Then, enter a second string, and again press &#60;ENTER&#62;."  7&nbsp;read var1     # 当 read $var1 时, "\" 将会阻止产生新行.   8&nbsp;              #     first line \  9&nbsp;              #     second line 10&nbsp; 11&nbsp;echo "var1 = $var1" 12&nbsp;#     var1 = first line second line 13&nbsp; 14&nbsp;#  对于每个以 "\" 结尾的行,  15&nbsp;#+ 你都会看到一个下一行的提示符, 让你继续向var1输入内容. 16&nbsp; 17&nbsp;echo; echo 18&nbsp; 19&nbsp;echo "Enter another string terminated by a \\ , then press &#60;ENTER&#62;." 20&nbsp;read -r var2  # -r 选项会让 "\" 转义. 21&nbsp;              #     first line \ 22&nbsp; 23&nbsp;echo "var2 = $var2" 24&nbsp;#     var2 = first line \ 25&nbsp; 26&nbsp;# 第一个 &#60;ENTER&#62; 就会结束var2变量的录入. 27&nbsp; 28&nbsp;echo  29&nbsp; 30&nbsp;exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><P><BCLASS="COMMAND">read</B>命令有些有趣的选项, 这些选项允许打印出一个提示符, 	      然后在不输入<BCLASS="KEYCAP">ENTER</B>的情况下, 可以读入你所按下的字符的内容.	      </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;# 不敲回车, 读取一个按键字符.  2&nbsp;  3&nbsp;read -s -n1 -p "Hit a key " keypress  4&nbsp;echo; echo "Keypress was "\"$keypress\""."  5&nbsp;  6&nbsp;# -s 选项意味着不打印输入.  7&nbsp;# -n N 选项意味着只接受N个字符的输入.  8&nbsp;# -p 选项意味着在读取输入之前打印出后边的提示符.  9&nbsp; 10&nbsp;# 使用这些选项是有技巧的, 因为你需要用正确的顺序来使用它们. 11&nbsp;		</PRE></FONT></TD></TR></TABLE></P><P><BCLASS="COMMAND">read</B>命令的<CODECLASS="OPTION">-n</CODE>选项也可以检测<EM>方向键</EM>, 	      和一些控制按键. </P><DIVCLASS="EXAMPLE"><HR><ANAME="ARROWDETECT"></A><P><B>例子 11-6. 检测方向键</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# arrow-detect.sh: 检测方向键, 和一些非打印字符的按键.  3&nbsp;# 感谢, Sandro Magi, 告诉了我们怎么做到这点.  4&nbsp;  5&nbsp;# --------------------------------------------  6&nbsp;# 按键所产生的字符编码.  7&nbsp;arrowup='\[A'  8&nbsp;arrowdown='\[B'  9&nbsp;arrowrt='\[C' 10&nbsp;arrowleft='\[D' 11&nbsp;insert='\[2' 12&nbsp;delete='\[3' 13&nbsp;# -------------------------------------------- 14&nbsp; 15&nbsp;SUCCESS=0 16&nbsp;OTHER=65 17&nbsp; 18&nbsp;echo -n "Press a key...  " 19&nbsp;# 如果不是上边列表所列出的按键, 可能还是需要按回车. (译者注: 因为一般按键是一个字符) 20&nbsp;read -n3 key                      # 读取3个字符. 21&nbsp; 22&nbsp;echo -n "$key" | grep "$arrowup"  # 检查输入字符是否匹配. 23&nbsp;if [ "$?" -eq $SUCCESS ] 24&nbsp;then 25&nbsp;  echo "Up-arrow key pressed." 26&nbsp;  exit $SUCCESS 27&nbsp;fi 28&nbsp; 29&nbsp;echo -n "$key" | grep "$arrowdown" 30&nbsp;if [ "$?" -eq $SUCCESS ] 31&nbsp;then 32&nbsp;  echo "Down-arrow key pressed." 33&nbsp;  exit $SUCCESS 34&nbsp;fi 35&nbsp; 36&nbsp;echo -n "$key" | grep "$arrowrt" 37&nbsp;if [ "$?" -eq $SUCCESS ] 38&nbsp;then 39&nbsp;  echo "Right-arrow key pressed." 40&nbsp;  exit $SUCCESS 41&nbsp;fi 42&nbsp; 43&nbsp;echo -n "$key" | grep "$arrowleft" 44&nbsp;if [ "$?" -eq $SUCCESS ] 45&nbsp;then 46&nbsp;  echo "Left-arrow key pressed." 47&nbsp;  exit $SUCCESS 48&nbsp;fi 49&nbsp; 50&nbsp;echo -n "$key" | grep "$insert" 51&nbsp;if [ "$?" -eq $SUCCESS ] 52&nbsp;then 53&nbsp;  echo "\"Insert\" key pressed." 54&nbsp;  exit $SUCCESS 55&nbsp;fi 56&nbsp; 57&nbsp;echo -n "$key" | grep "$delete" 58&nbsp;if [ "$?" -eq $SUCCESS ] 59&nbsp;then 60&nbsp;  echo "\"Delete\" key pressed." 61&nbsp;  exit $SUCCESS 62&nbsp;fi 63&nbsp; 64&nbsp; 65&nbsp;echo " Some other key pressed." 66&nbsp; 67&nbsp;exit $OTHER 68&nbsp; 69&nbsp;#  练习: 70&nbsp;#  ----- 71&nbsp;#  1) 使用'case'结构来代替'if'结构,  72&nbsp;#+    这样可以简化这个脚本. 73&nbsp;#  2) 添加 "Home", "End", "PgUp", 和 "PgDn" 这些按键的检查.</PRE></FONT></TD></TR></TABLE><HR></DIV><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>对于<BCLASS="COMMAND">read</B>命令来说, 				<CODECLASS="OPTION">-n</CODE>选项不会检测<BCLASS="KEYCAP">ENTER</B>(新行)键.	      </P></TD></TR></TABLE></DIV><P><BCLASS="COMMAND">read</B>命令的<CODECLASS="OPTION">-t</CODE>选项允许时间输入(参考<AHREF="internalvariables.html#TOUT">例子 9-4</A>).</P><P><BCLASS="COMMAND">read</B>命令也可以从<AHREF="io-redirection.html#IOREDIRREF">重定向</A>的文件中<SPANCLASS="QUOTE">"读取"</SPAN>变量的值. 	      如果文件中的内容超过一行, 	      那么只有第一行被分配到这个变量中.	      如果<BCLASS="COMMAND">read</B>命令的参数个数超过一个, 		  那么每个变量都会从文件中取得一个分配的字符串作为变量的值, 		  这些字符串都是以<AHREF="special-chars.html#WHITESPACEREF">定义的空白字符</A>来进行分隔的.	      小心使用!</P><DIVCLASS="EXAMPLE"><HR><ANAME="READREDIR"></A><P><B>例子 11-7. 通过<AHREF="io-redirection.html#IOREDIRREF">文件重定向</A>来使用<BCLASS="COMMAND">read</B>命令</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;

⌨️ 快捷键说明

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