个性化阅读
专注于IT技术分析

Linux shell编程:shell引用机制解读和用法

上一篇Linux shell编程教程请查看:shell转义或替换介绍和用法

在本章中我们将详细讨论Shell引用机制,下面我们先从讨论元字符开始。

1、元字符

Unix Shell提供了各种元字符,这些元字符在任何Shell脚本中使用时都有特殊的意义,除非使用引号否则会导致单词终止。例如?在目录中列出文件时匹配单个字符,*匹配多个字符。

这里列出了大多数shell特殊字符(也称为元字符):

* ? [ ] ' " \ $ ; & ( ) | ^ < > new-line space tab

可以通过在字符前面加上\来引用字符,下面的示例演示如何打印*或?。

#!/bin/bash

echo AA; BB

执行之后将收到以下结果:

Hello
./test.sh: line 2: BB: command not found

shell returned 105

现在让我们尝试使用一个引用字符:

#!/bin/bash

echo AA\; BB

以上例子将输出“AA; BB”,另外$符号是元字符之一,因此必须引用它以避免shell的特殊处理:

#!/bin/bash

echo "I have \$500"

执行之后我们将得到”I have $500”的正常输出,下表列出了四种形式的引用:

编号 引用 & 描述
1 单引号 所有这些引号之间的特殊字符都失去了它们的特殊意义。
2 双引号 除了这些特殊的意义外,这些特殊的意义也失去了 $ ` \$ \’ \” \\
3 反斜杠 任何紧跟着反斜杠的字符都失去了它的特殊意义。
4 后引号 任何位于后引号之间的内容都将被视为命令并执行。

2、单引号

考虑一个包含许多特殊shell字符的echo命令:

echo <-$100.**>; (update?) [y|n]

在每个特殊字符前加上反斜杠是一件很乏味的事情,而且会使一行很难读懂:

echo \<-\$100.\*\*\>\; \(update\?\) \[y\|n\]

有一个简单的方法可以引用大量的字符,在字符串的开头和结尾加一个单引号(‘)

echo '<-$100.**>; (update?) [y|n]'

单引号内的字符被引用,就像每个字符前面有一个反斜杠一样。这样echo命令将以适当的方式显示。

如果输出的字符串中出现了一个单引号,那么不应该将整个字符串放在单引号中,而应该在前面使用反斜杠(\),如下的例子所示:

echo 'It\'s fun

3、双引号

尝试执行以下shell脚本,这个shell脚本使用单引号:

VAR=ESPANA
echo '$VAR <-$10.**>; [ (`date +%m/%d`) ]'

执行之后将收到以下结果

$VAR <-$10.**>; [ (`date +%m/%d`) ]

这不是必须展示的东西,很明显单引号防止变量替换。如果希望替换变量值并使单引号按预期工作,则需要将命令放在双引号中如下所示

VAR=ESPANA
echo "$VAR <-$10.**>; [ (`date +%m/%d`) ]"

执行之后将收到以下结果:

ESPANA <-$10.**>; [ (11/02) ]

双引号去掉了除下列字符之外的所有字符的特殊含义:

(1)$用于参数替换

(2)命令替换的反引号

(3)\$启用文字美元符号

(4)启用文字反引号

(5)启用嵌入双引号

(6)启用嵌入的反斜杠

(7)所有其他\字符都是文字字符(不特殊)

单引号内的字符被引用,就像每个字符前面有一个反斜杠一样。这有助于echo命令正确显示。

如果输出的字符串中出现了一个单引号,那么不应该将整个字符串放在单引号中,而应该在前面使用反斜杠(\),如下所示:

echo 'It\'s fun'

4、反引号

在反引号之间放置任何Shell命令都将执行该命令,下面是将任何Shell命令置于反引号之间的简单语法:

var=`command`

在下面的示例中执行date命令,生成的结果存储在DATA变量中。

DATE=`date`

echo "当前日期: $DATE"
赞(0)
未经允许不得转载:srcmini » Linux shell编程:shell引用机制解读和用法

评论 抢沙发

评论前必须登录!