- Unix/Linux 初学者指南
- Unix/Linux - 首页
- Unix/Linux - 什么是 Linux?
- Unix/Linux - 入门指南
- Unix/Linux - 文件管理
- Unix/Linux - 目录
- Unix/Linux - 文件权限
- Unix/Linux - 环境
- Unix/Linux - 基本实用程序
- Unix/Linux - 管道与过滤器
- Unix/Linux - 进程
- Unix/Linux - 通信
- Unix/Linux - vi 编辑器
- Unix/Linux Shell 编程
- Unix/Linux - Shell 脚本
- Unix/Linux - 什么是 Shell?
- Unix/Linux - 使用变量
- Unix/Linux - 特殊变量
- Unix/Linux - 使用数组
- Unix/Linux - 基本运算符
- Unix/Linux - 决策
- Unix/Linux - Shell 循环
- Unix/Linux - 循环控制
- Unix/Linux - Shell 替换
- Unix/Linux - 引用机制
- Unix/Linux - I/O 重定向
- Unix/Linux - Shell 函数
- Unix/Linux - 手册页帮助
- 高级 Unix/Linux
- Unix/Linux - 标准 I/O 流
- Unix/Linux - 文件链接
- Unix/Linux - 正则表达式
- Unix/Linux - 文件系统基础
- Unix/Linux - 用户管理
- Unix/Linux - 系统性能
- Unix/Linux - 系统日志
- Unix/Linux - 信号和陷阱
Unix/Linux - Shell 引用机制
在本章中,我们将详细讨论 Shell 引用机制。我们将从讨论元字符开始。
元字符
Unix Shell 提供了各种元字符,这些字符在 Shell 脚本中使用时具有特殊含义,并导致单词终止,除非被引用。
例如,? 在列出目录中的文件时与单个字符匹配,而* 匹配多个字符。以下是大多数 Shell 特殊字符(也称为元字符)的列表:-
* ? [ ] ' " \ $ ; & ( ) | ^ < > new-line space tab
可以通过在字符前加上\来引用(即使其代表自身)。
示例
以下示例显示了如何打印* 或?:-
#!/bin/sh echo Hello; Word
执行后,您将收到以下结果:-
Hello ./test.sh: line 2: Word: command not found shell returned 127
现在让我们尝试使用引用的字符:-
#!/bin/sh echo Hello\; Word
执行后,您将收到以下结果:-
Hello; Word
$ 符号是元字符之一,因此必须对其进行引用以避免 Shell 的特殊处理:-
#!/bin/sh echo "I have \$1200"
执行后,您将收到以下结果:-
I have $1200
下表列出了四种引用形式:-
序号 | 引用和描述 |
---|---|
1 |
单引号 这些引号之间的所有特殊字符都失去了其特殊含义。 |
2 |
双引号 这些引号之间的大多数特殊字符都失去了其特殊含义,但以下例外:-
|
3 |
反斜杠 反斜杠后面的任何字符都将失去其特殊含义。 |
4 |
反引号 反引号之间的任何内容都将被视为命令并执行。 |
单引号
考虑一个包含许多 Shell 特殊字符的 echo 命令:-
echo <-$1500.**>; (update?) [y|n]
在每个特殊字符前面加上反斜杠既繁琐又使行难以阅读:-
echo \<-\$1500.\*\*\>\; \(update\?\) \[y\|n\]
有一种简单的方法可以引用大量字符。在字符串的开头和结尾加上单引号('):-
echo '<-$1500.**>; (update?) [y|n]'
单引号内的字符就像每个字符前面都有一个反斜杠一样被引用。这样,echo 命令就可以以正确的方式显示。
如果在要输出的字符串中出现单引号,则不应将整个字符串放在单引号内,而应使用反斜杠(\)在前面加上它,如下所示:-
echo 'It\'s Shell Programming
双引号
尝试执行以下 Shell 脚本。此 Shell 脚本使用了单引号:-
VAR=ZARA echo '$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]'
执行后,您将收到以下结果:-
$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]
这不是要显示的内容。很明显,单引号阻止了变量替换。如果要替换变量值并使反引号按预期工作,则需要将命令放在双引号中,如下所示:-
VAR=ZARA echo "$VAR owes <-\$1500.**>; [ as of (`date +%m/%d`) ]"
执行后,您将收到以下结果:-
ZARA owes <-$1500.**>; [ as of (07/02) ]
双引号消除了除以下字符之外的所有字符的特殊含义:-
$ 用于参数替换
反引号用于命令替换
\$ 用于启用文字美元符号
\` 用于启用文字反引号
\" 用于启用嵌入式双引号
\\ 用于启用嵌入式反斜杠
所有其他\ 字符都是文字(非特殊)
单引号内的字符就像每个字符前面都有一个反斜杠一样被引用。这有助于 echo 命令正确显示。
如果在要输出的字符串中出现单引号,则不应将整个字符串放在单引号内,而应使用反斜杠(\)在前面加上它,如下所示:-
echo 'It\'s Shell Programming'
反引号
将任何 Shell 命令放在反引号之间会执行该命令。
语法
以下是将任何 Shell 命令放在反引号之间的简单语法:-
var=`command`
示例
在以下示例中,date 命令被执行,产生的结果存储在 DATA 变量中。
DATE=`date` echo "Current Date: $DATE"
执行后,您将收到以下结果:-
Current Date: Thu Jul 2 05:28:45 MST 2009