电器网站建设流程,深圳网络营销做什么的,外贸购物网站建站,免费ppt下载软件bash引用-Quoting详细介绍 概述
引用的字面意思就是#xff0c;用引号括住一个字符串。这可以保护字符串中的特殊字符不被shell或shell脚本重新解释或扩展。(如果一个字有不同于其字面意思的解释#xff0c;它就是“特殊的”。例如#xff1a;星号*除了本身代表*号以外还表… bash引用-Quoting详细介绍 概述
引用的字面意思就是用引号括住一个字符串。这可以保护字符串中的特殊字符不被shell或shell脚本重新解释或扩展。(如果一个字有不同于其字面意思的解释它就是“特殊的”。例如星号*除了本身代表*号以外还表示文件通配和正则表达式中的通配符)。
[rootcentos8 ~]$ ls -l P*
Pictures:
total 0
Public:
total 0
[rootcentos8 ~]$ ls -l P*
ls: cannot access P*: No such file or directory在生活中用语或者书写当我们使用双引号引用一个句子时我们会区别对待该句子并赋予其特殊意义在Bash脚本中当我们使用双引号string引用一个字符串时我们同样区别对待并保护其字面意思一般性的意思。 在涉及到命令替换时引用可以让echo输出带格式的命令结果,保留变量所带的空白符号。
bash$ echo $(ls -l) # 无引号命令替换
total 8 -rw-rw-r-- 1 bo bo 13 Aug 21 12:57 t.sh -rw-rw-r-- 1 bo bo 78 Aug 21 12:57 u.sh
bash$ echo $(ls -l) # 被引用的命令替换
total 8-rw-rw-r-- 1 bo bo 13 Aug 21 12:57 t.sh-rw-rw-r-- 1 bo bo 78 Aug 21 12:57 u.sh5.1. 引用变量(Quoting Variables) 当我们引用一个变量时比较建议的做法是使用双引号将其引用起来。这样做可以避免bash再次解析双引号中的特殊字符只不过$、反引号、和反斜杠\仍然会被bash解析。在双引号中的$符号仍然被视为特殊字符这样做的好处是可以进行变量替换(“$variable”),也就是使用变量的值替换掉变量名。 使用双引号的另一个用途是防止单词分割。在双引号中的参数表现为单个词语(即使其包含空白字符)。
Listone two three
for a in $List # 使用空格符作为分隔符分割变量的值(字符串).
doecho $a
done
# 输出
# one
# two
# three
echo ---
for a in $List # Preserves whitespace in a single variable.
do # ^ ^echo $a
done
# 输出
# one two three下面是一个更加精心设计的例子
variable1a variable containing five words
COMMAND This is $variable1 # 执行COMMAND命令时会被认为带了7个参数如下:
# This is a variable containing five words
COMMAND This is $variable1 # # 执行COMMAND命令时会被认为带了1个参数如下:
# This is a variable containing five words
variable2 # 空变量.
COMMAND $variable2 $variable2 $variable2# COMMAND命令没带参数执行.
COMMAND $variable2 $variable2 $variable2# 带了三个空参数执行COMMAND命令.
COMMAND $variable2 $variable2 $variable2# COMMAND命令带一个参数执行(该参数为2个空格).
# 谢谢这个大佬指出:Stéphane Chazelas.使用echo给标准输出打印奇怪的字符 例 5-1. echo输出奇怪的变量 #!/bin/bash
# weirdvars.sh: Echoing weird variables.
echo
var(]\\{}\$\
echo $var # (]\{}$
echo $var # (]\{}$ 结果相同.
echo
IFS\
echo $var # (] {}$ \ 变为了空格为什么?(IFS为内部域分割符临时使用\作为分隔符)
echo $var # (]\{}$
# 以上例子来自Stephane Chazelas.
echo
var2\\\\\
echo $var2 #
echo $var2 # \\
echo
# 但是 ... var2\\\\ 是非法的此处四个\位置2,4的两个刚好被转义而剩余3个符所以不行
var3\\\\
echo $var3 # \\\\
# 但是强引用可以.
# ************************************************************ #
# 变量嵌套替换也可以
echo $(echo ) #
# ^ ^
# 某些情况下嵌套很有用
var1Two bits
echo \$var1 $var1 # $var1 Two bits
# ^ ^
# Or, as Chris Hiestand points out ...
if [[ $(du $My_File1) -gt $(du $My_File2) ]]
# ^ ^ ^ ^ ^ ^ ^ ^
then...
fi
# ************************************************************ #单引号(’ )的工作机制类似于双引号但是在单括号中不允许变量替换因为$符的特殊意义被关闭了。在单引号中任何特殊的符号都按照字面意思解释(除了’单引号自身)。 由于转义符(逃逸符)在单引号中都失去了转义的意义所以试图在单引号中括单引号是不行的下面的例子可以实现输出单引号。
echo Why cant I write s between single quotes
echo
# The roundabout method.
echo Why can\t I write s between single quotes
# |-------| |----------| |-----------------------|
# 上面使用了三个单引号组一个转义的单引号和一个双引号引起的单引号.5.2. 转义/逃逸(Escaping)
转义是一种用来引用单个字符的方法。在字符前的反斜杠\告诉shell以字面意思解析该字符。 注意在echo或者sed这些程序命令中转义某个字符可能有相反的作用可以触发某种特殊意义。 特定的被转义的字符所具有的意义如下: used with echo and sed
\n 新行(means newline)
\r 回车(means return)
\t tab键
\v 垂直tab键(means vertical tab)
\b 退格(means backspace)
\a 报警(means alert (beep or flash))
\0xx 将反斜杠后的数字视为八进制的ASCII码值$’ … ’ :该符号结构的机制是使用转义的八进制或者十六进制值将ASCII码赋给变量例如quote$‘\042’. 例5-2. 被转义的字符(Escaped Characters) #!/bin/bash
# escaped.sh: escaped characters
#############################################################
### First, lets show some basic escaped-character usage. ###
#############################################################
# Escaping a newline.
# ------------------
echo
echo This will print
as two lines.
# 上面的写法将会打印两行
echo This will print \
as one line.
# 上面的写法将会打印一行
echo; echo
echo
echo \v\v\v\v # 按照字面意思打印 \v\v\v\v .
# 使用 -e 选项 打印转义字符所代表的字符
echo
echo VERTICAL TABS # 垂直tab键
echo -e \v\v\v\v # 此时将会打印四个垂直tab
echo
echo QUOTATION MARK
echo -e \042 # 打印一个双引号 (quote, 八进制的 ASCII 值:42;代表一个双引号).
echo
# 使用该结构 $\X 使得-e选项不在需要
echo; echo NEWLINE and (maybe) BEEP
echo $\n # 新行.
echo $\a # 警告音(beep).# May only flash, not beep, depending on terminal.
# We have seen $\nnn string expansion, and now . . .
# #
# $\nnn 该种字符串展开的机制在bash2.0中引进
# #
echo Introducing the \$\ ... \ string-expansion construct . . .
echo . . . featuring more quotation marks.
echo $\t \042 \t # 打印左右两边分别有个tab键的双引号().
# \nnn 为八进制数.
echo
# 将一个ASCII字符赋值给一个变量
# ----------------------------------------
quote$\042 # 赋值给一个变量
echo $quote Quoted string $quote and this lies outside the quotes.
echo
# Concatenating ASCII chars in a variable.
triple_underline$\137\137\137 # 137 是八进制的ASCII值代表_.
echo $triple_underline UNDERLINE $triple_underline
echo
ABC$\101\102\103\010 # 101, 102, 103 分别代表 A, B, C.
echo $ABC
echo
escape$\033 # 033 是escape的八进制表示.
echo \escape\ echoes as $escape
# 并无可视化的输出.
echo
exit 0一个更加精心设计的例子 例5-3. 检测按键(Detecting key-presses) #!/bin/bash
# Author: Sigurd Solaas, 20 Apr 2011
# Used in ABS Guide with permission.
# Requires version 4.2 of Bash.
keyno value yet
while true; doclearecho Bash Extra Keys Demo. Keys to try:#Bash 识别按键的demo.可以识别一下按键:echoecho * Insert, Delete, Home, End, Page_Up and Page_Downecho * The four arrow keys#四个方向键echo * Tab, enter, escape, and space key#tab,回车返回空格键echo * The letter and number keys, etc.#标点按键echoecho d show date/timeecho q quitecho echo# Convert the separate home-key to home-key_num_7:if [ $key $\x1b\x4f\x48 ]; thenkey$\x1b\x5b\x31\x7e# Quoted string-expansion construct. fi# Convert the separate end-key to end-key_num_1.if [ $key $\x1b\x4f\x46 ]; thenkey$\x1b\x5b\x34\x7eficase $key in$\x1b\x5b\x32\x7e) # Insertecho Insert Key;;$\x1b\x5b\x33\x7e) # Deleteecho Delete Key;;$\x1b\x5b\x31\x7e) # Home_key_num_7echo Home Key;;$\x1b\x5b\x34\x7e) # End_key_num_1echo End Key;;$\x1b\x5b\x35\x7e) # Page_Upecho Page_Up;;$\x1b\x5b\x36\x7e) # Page_Downecho Page_Down;;$\x1b\x5b\x41) # Up_arrowecho Up arrow;;$\x1b\x5b\x42) # Down_arrowecho Down arrow;;$\x1b\x5b\x43) # Right_arrowecho Right arrow;;$\x1b\x5b\x44) # Left_arrowecho Left arrow;;$\x09) # Tabecho Tab Key;;$\x0a) # Enterecho Enter Key;;$\x1b) # Escapeecho Escape Key;;$\x20) # Spaceecho Space Key;;d)date;;q)echo Time to quit...echoexit 0;;*)echo You pressed: \$key\;;esacechoecho unset K1 K2 K3read -s -N1 -p Press a key: K1$REPLYread -s -N2 -t 0.001K2$REPLYread -s -N1 -t 0.001K3$REPLYkey$K1$K2$K3
done
exit $?\ 还原双引号的字面意思(就是双引号不在用于引用) echo Hello # Hello
echo \Hello\ ... he said. # Hello ... he said.$ 还原$符的字面意思意思是在$后的变量不会被替换 echo \$variable01 # $variable01
echo The book cost \$7.98. # The book cost $7.98.\\ 还原\的字面意思 echo \\ # Results in \
# Whereas . . .
echo \ # Invokes secondary prompt from the command-line.# In a script, gives an error message.
# However . . .
echo \ # Results in \反斜杠\在不同的情况下表现出不一样的行为(是否被转义是否位于强引用中是否在弱引用中是否在命令替换中是否在“here document”) # 简单的转义和引用
echo \z # z
echo \\z # \z
echo \z # \z
echo \\z # \\z
echo \z # \z
echo \\z # \z# 命令替换
echo ècho \z # z
echo ècho \\z # z
echo ècho \\\z # \z
echo ècho \\\\z # \z
echo ècho \\\\\\z # \z
echo ècho \\\\\\\z # \\z
echo ècho \z # \z
echo ècho \\z # \z# 此处文本(Here document)
cat EOF
\z
EOF # \z
cat EOF
\\z
EOF # \z
# These examples supplied by Stéphane Chazelas.赋给某个变量的字符串中的某些元素可能会被(能够被)转义但是单个被转义的字符不一定可以赋给变量。
variable\
echo $variable
# 不可行打印一个错误提示:
# test.sh: : command not found
# 单独一个转义字符不可赋给变量
#
# 事实上此处转义字符 \ 转义了新行在编写比较长的命令时就可以使用一个转义符来将命令写成多行
# 真正的行为是 variableecho $variable
# 把命令赋值给变量是不允许的
variable\
23skidoo
echo $variable # 23skidoo# 可行因为第二行是合法的变量且实际上第二行被转义成了第一。
variable\
# \^ 转义符后跟一个空格
echo $variable # 输出空格
variable\\
echo $variable # \
variable\\\
echo $variable
# 行不通出错
# test.sh: \: command not found
#
# 上面三个转义符中第一个转义可第二个但是第三个转义符还在类似于第一个例子。
variable\\\\
echo $variable # \\# Second and fourth escapes escaped.# This is o.k.
转义空格可以防止命令的参数列表发生词语分割。Escaping a space can prevent word splitting in a command’s argument list.
file_list/bin/cat /bin/gzip /bin/more /usr/bin/less /usr/bin/emacs-20.7
# List of files as argument(s) to a command.# Add two files to the list, and list all.
ls -l /usr/X11R6/bin/xsetroot /sbin/dump $file_list
echo -------------------------------------------------------------------------
# What happens if we escape a couple of spaces?
ls -l /usr/X11R6/bin/xsetroot\ /sbin/dump\ $file_list
输出
################################
[rootcentos8 ~]#ls -l /usr/X11R6/bin/xsetroot\ /sbin/dump\ $file_list
ls: cannot access /usr/X11R6/bin/xsetroot /sbin/dump /bin/cat: No such file or directory
################################
# Error: the first three files concatenated into a single argument to ls -l
# because the two escaped spaces prevent argument (word) splitting.转义也有等待多行命令的意思。一般的不同的行会是不同的命令但是行末的转义字符转义了新行的字符命令可以一直写到下一行。
(cd /source/directory tar cf - . ) | \
(cd /dest/directory tar xpvf -)
# 该命令为Alan Cox写的拷贝命令作两行写增加了易读性。
# 下面的命令同样功能:
tar cf - -C /source/directory . |
tar xpvf - -C /dest/directory
# See note below.
# (Thanks, Stéphane Chazelas.)如果脚本行结束跟一个|,一个管道符号那么转义字符\就不是那么严格的需要了。但是后面跟上转义字符是比较好的习惯。
echo foo
bar
##两行
#foo
#bar
echo
echo foo
bar # 仍然是两行
#foo
#bar
echo
echo foo\
bar # 换行符被转义输出一行.
#foobar
echo
echo foo\
bar # 同样是一行转义字符在弱引用中(\)不会丢掉其转义字符的特殊意义。
#foobar
echo
echo foo\
bar # 两行因为转义字符在强引用(\)中失去了转义字符的意义被bash按照字面意义解释。
#foo\
#bar
# Examples suggested by Stéphane Chazelas.
文章转载自: http://www.morning.nkkr.cn.gov.cn.nkkr.cn http://www.morning.lhwlp.cn.gov.cn.lhwlp.cn http://www.morning.xjkr.cn.gov.cn.xjkr.cn http://www.morning.rlkgc.cn.gov.cn.rlkgc.cn http://www.morning.ktfnj.cn.gov.cn.ktfnj.cn http://www.morning.yntsr.cn.gov.cn.yntsr.cn http://www.morning.gdpai.com.cn.gov.cn.gdpai.com.cn http://www.morning.zlwg.cn.gov.cn.zlwg.cn http://www.morning.cjmmt.cn.gov.cn.cjmmt.cn http://www.morning.sjwws.cn.gov.cn.sjwws.cn http://www.morning.nqmwk.cn.gov.cn.nqmwk.cn http://www.morning.mlhfr.cn.gov.cn.mlhfr.cn http://www.morning.tgqzp.cn.gov.cn.tgqzp.cn http://www.morning.zlwg.cn.gov.cn.zlwg.cn http://www.morning.rldph.cn.gov.cn.rldph.cn http://www.morning.cmcjp.cn.gov.cn.cmcjp.cn http://www.morning.rglp.cn.gov.cn.rglp.cn http://www.morning.lmzpk.cn.gov.cn.lmzpk.cn http://www.morning.mbfkt.cn.gov.cn.mbfkt.cn http://www.morning.bljcb.cn.gov.cn.bljcb.cn http://www.morning.xskbr.cn.gov.cn.xskbr.cn http://www.morning.wtwhj.cn.gov.cn.wtwhj.cn http://www.morning.djbhz.cn.gov.cn.djbhz.cn http://www.morning.yjdql.cn.gov.cn.yjdql.cn http://www.morning.cznsq.cn.gov.cn.cznsq.cn http://www.morning.rgzc.cn.gov.cn.rgzc.cn http://www.morning.bqwsz.cn.gov.cn.bqwsz.cn http://www.morning.jxltk.cn.gov.cn.jxltk.cn http://www.morning.jnhhc.cn.gov.cn.jnhhc.cn http://www.morning.crkmm.cn.gov.cn.crkmm.cn http://www.morning.mzydm.cn.gov.cn.mzydm.cn http://www.morning.qyfrd.cn.gov.cn.qyfrd.cn http://www.morning.eviap.com.gov.cn.eviap.com http://www.morning.yrmpr.cn.gov.cn.yrmpr.cn http://www.morning.wspjn.cn.gov.cn.wspjn.cn http://www.morning.nbwyk.cn.gov.cn.nbwyk.cn http://www.morning.npxcc.cn.gov.cn.npxcc.cn http://www.morning.jsphr.cn.gov.cn.jsphr.cn http://www.morning.hjrjr.cn.gov.cn.hjrjr.cn http://www.morning.xbbrh.cn.gov.cn.xbbrh.cn http://www.morning.jlnlr.cn.gov.cn.jlnlr.cn http://www.morning.rnygs.cn.gov.cn.rnygs.cn http://www.morning.pbzlh.cn.gov.cn.pbzlh.cn http://www.morning.yntsr.cn.gov.cn.yntsr.cn http://www.morning.xckdn.cn.gov.cn.xckdn.cn http://www.morning.bgpb.cn.gov.cn.bgpb.cn http://www.morning.kyjyt.cn.gov.cn.kyjyt.cn http://www.morning.cfjyr.cn.gov.cn.cfjyr.cn http://www.morning.khtyz.cn.gov.cn.khtyz.cn http://www.morning.sjsfw.cn.gov.cn.sjsfw.cn http://www.morning.blqmn.cn.gov.cn.blqmn.cn http://www.morning.rbcw.cn.gov.cn.rbcw.cn http://www.morning.mjctt.cn.gov.cn.mjctt.cn http://www.morning.qqnjr.cn.gov.cn.qqnjr.cn http://www.morning.skscy.cn.gov.cn.skscy.cn http://www.morning.lbcbq.cn.gov.cn.lbcbq.cn http://www.morning.lsbjj.cn.gov.cn.lsbjj.cn http://www.morning.gwdmj.cn.gov.cn.gwdmj.cn http://www.morning.nrpp.cn.gov.cn.nrpp.cn http://www.morning.dbrpl.cn.gov.cn.dbrpl.cn http://www.morning.kdtdh.cn.gov.cn.kdtdh.cn http://www.morning.tllws.cn.gov.cn.tllws.cn http://www.morning.bpptt.cn.gov.cn.bpptt.cn http://www.morning.jtmrx.cn.gov.cn.jtmrx.cn http://www.morning.rcfwr.cn.gov.cn.rcfwr.cn http://www.morning.wyjhq.cn.gov.cn.wyjhq.cn http://www.morning.dtzxf.cn.gov.cn.dtzxf.cn http://www.morning.kjjbz.cn.gov.cn.kjjbz.cn http://www.morning.njstzsh.com.gov.cn.njstzsh.com http://www.morning.nhlyl.cn.gov.cn.nhlyl.cn http://www.morning.xpqdf.cn.gov.cn.xpqdf.cn http://www.morning.rybr.cn.gov.cn.rybr.cn http://www.morning.gynlc.cn.gov.cn.gynlc.cn http://www.morning.pltbd.cn.gov.cn.pltbd.cn http://www.morning.rywr.cn.gov.cn.rywr.cn http://www.morning.dztp.cn.gov.cn.dztp.cn http://www.morning.rlqwz.cn.gov.cn.rlqwz.cn http://www.morning.fxzw.cn.gov.cn.fxzw.cn http://www.morning.kmcfw.cn.gov.cn.kmcfw.cn http://www.morning.rszwc.cn.gov.cn.rszwc.cn