Linux Shell 脚本:Shell 中的引号机制 0 个改进

在本章中,我们将详细讨论 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

以下表格列出了四种引用方式 −

引用方式 说明
单引号 这些引号之间的所有特殊字符都失去了它们的特殊意义。
双引号 这些引号之间的大多数特殊字符都失去了它们的特殊意义,这些除外 − $, </code>,\$,\',\",\`
反斜杠 反斜杠后面的任何字符都会失去其特殊意义
反引号 反引号之间的任何内容都将被视为命令并将被执行。

单引号引用

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

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

在每个特殊字符前面放置一个反斜杠显得既冗长又难于阅读 −

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

有一个简单的方法来引用大量的元字符组。在字符串的开头和结尾各放置一个单引号 '

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

单引号中的元字符被引用,就像反斜杠在每个字符前面起到的作用一样。 这样, echo 命令将正确的显示。

如果需要输出的字符串中出现单引号,则不应将整个字符串放在单个引号中,而应使用反斜杠 \ 放置在单引号之前,如下所示 −

echo 'It\'s Shell Programming

双引号引用

尝试执行下面使用单引号引用的 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
本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!