引用必要性
这里只讲述引用的基本规则。因为使用引用的例子很多。本书接下来的两个部分将一一予以讲述。脚本中执行行操作时, shell将对脚本设置予以解释。要采取一种方法防止shell这样做,即使用引用号,包括各式引用或使用反斜线。一些用户在对文本字符串进行反馈操作时觉得使用引用很麻烦。有时不注意,只引用了一半,这时问题出现了。最好在反馈文本字符串时使用双引号。下面是各种引用的例子。
文本返回了,但由于未使用双引号,* 被shell误解,shell认为用户要做目录列表。用双引号得结果如下:
这样就不会有误解产生。表15-1列出各种引用类型。
表15-1 shell引用类型
双引号
使用双引号可引用除字符$、`、\外的任意字符或字符串。这些特殊字符分别为美元符号,反引号和反斜线,对shell来说,它们有特殊意义。如果使用双引号将字符串赋给变量并反馈它,实际上与直接反馈变量并无差别。
现在假定要设置系统时间输出到变量mydate。
因为shell将" "符号里的字符串赋予变量mydate,date已没有特定意义,故此变量只保存单
词date。
如果要查询包含空格的字符串,经常会用到双引号。以下使用grep抽取名字“Davey Wire”,
因为没有加双引号,grep将“Davey”认作字符串,而把“Wire”当作文件名。
要解决这个问题,可将字符串加双引号。这样shell会忽略空格,当使用字符时,应总是
使用双引号,无论它是单个字符串或是多个单词。
在一个反馈的文本行里可以使用双引号将变量引起来。下面的例子中,shell反馈文本行, 遇到符号$,知道这是一个变量,然后用变量值boy替换变量$BOY。 单引号与双引号类似,不同的是shell会忽略任何引用值。换句话说,如果屏蔽了其特殊 含义,会将引号里的所有字符,包括引号都作为一个字符串。使用上一个例子,结果如下: 反引号
反引号用于设置系统命令的输出到变量。shell将反引号中的内容作为一个系统命令,并 执行其内容。使用这种方法可以替换输出为一个变量。反引号可以与引号结合使用。下面将 举例说明。 下面的例子中,shell试图替代单词hello为系统命令并执行它,因为hello脚本或命令不存 在,返回错误信息。 这次命令有效,shell正确执行。下面将命令输出设置为变量mydate,时间格式如下: 另一个例子中,将反引号嵌在双引号里: 上面的例子中,打印字符串后,shell遇到反引号,将其看作一条命令执行它。如果下一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义。下述字符包含有特殊意义: & * + ^ $ ` " | ?。假定echo命令加*,意即以串行顺序打印当前整个目录列表,而不是一个星号*。 为屏蔽星号特定含义,可使用反斜线。 上述语句同样可用于$ $命令, s h e l l解释其为现在进程ID号,使用反斜线屏蔽此意,仅打印$。 在打印字符串时要加入八进制字符(ASCII相应字符),必须在前面加反斜线,否则shell将其当作普通数字处理。
在一个反馈的文本行里可以使用双引号将变量引起来。下面的例子中,shell反馈文本行, 遇到符号$,知道这是一个变量,然后用变量值boy替换变量$BOY。 单引号与双引号类似,不同的是shell会忽略任何引用值。换句话说,如果屏蔽了其特殊 含义,会将引号里的所有字符,包括引号都作为一个字符串。使用上一个例子,结果如下: 反引号
反引号用于设置系统命令的输出到变量。shell将反引号中的内容作为一个系统命令,并 执行其内容。使用这种方法可以替换输出为一个变量。反引号可以与引号结合使用。下面将 举例说明。 下面的例子中,shell试图替代单词hello为系统命令并执行它,因为hello脚本或命令不存 在,返回错误信息。 这次命令有效,shell正确执行。下面将命令输出设置为变量mydate,时间格式如下: 另一个例子中,将反引号嵌在双引号里: 上面的例子中,打印字符串后,shell遇到反引号,将其看作一条命令执行它。如果下一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义。下述字符包含有特殊意义: & * + ^ $ ` " | ?。假定echo命令加*,意即以串行顺序打印当前整个目录列表,而不是一个星号*。 为屏蔽星号特定含义,可使用反斜线。 上述语句同样可用于$ $命令, s h e l l解释其为现在进程ID号,使用反斜线屏蔽此意,仅打印$。 在打印字符串时要加入八进制字符(ASCII相应字符),必须在前面加反斜线,否则shell将其当作普通数字处理。
使用命令expr时,用 * 表示乘法会出现错误,在 * 前加上反斜线才会正确。
在echo命令中加入元字符,必须用反斜线起屏蔽作用。下面的例子要显示价格$19.99。其中$屏蔽与不屏蔽将产生不同的结果。
使用反斜线屏蔽$,可得更好的结果。
本章小结:
在引用时会遇到一些问题且经常出错。我在使用引用时遵循两条规则:
1) 反馈字符串用双引号;但不要引用反馈本身。
2) 如果使用引用得到的结果不理想,再试另一种,毕竟只有三种引用方式,可以充分尝试。
本章完毕~~