作者: Edengundam(马涛)
今天看病速度真快, 趁着空隙, 我就继续上次没有完成工作, 介绍双引号. 双引号用的地方太多了, 今天我依然会在Bash, Perl和PowerShell之间进行对比, 对比的三个方面没有变化: 变量展开(也被称为: 变量代换, 变量篡改. ), 转义字符, 引号自身.
|
变量代换
|
转义字符支持程度
|
双引号自身引用
|
Bash
|
允许
|
允许
|
注1
|
Perl
|
允许
|
允许
|
注2
|
PowerShell
|
允许
|
允许
|
注3
|
注1: Bash中, 只能使用转义序列来引用双引号, 这里不包括使用反引号或$()两种捕获程序输出的情况.
注2: Perl的双引号中, 转义序列发挥了完全的功能, 具体细节可以参考perldoc或learning perl.
注3: PowerShell中, 可以使用转义序列和连续出现的两个双引号当作一个双引号. 请见例子.
双引号, 是非常有用的工具, 由于支持了变量代换和转义字符的支持(其实PowerShell和Bash还支持另外一种功能, 类似于子表达式求值, 我将单独为大家介绍.). 使得您在组合变量和字符串的连接, 输出格式控制上有了更多的能力.
在看例子之前, 我先介绍我使用引号的习惯, 既然是习惯, 因人而异, 没有对错. 但是, 我相信好的习惯, 是能够避免一些潜在的错误的.
1. 无论使用Bash, Perl, PowerShell, 只要不使用变量代换和转义字符, 只使用单引号;
2. 使用正则表达式时, 表达式如果不复杂, 只使用单引号;
3. 需要控制换行等格式时, 优先使用现有的cmdlet(Bash中使用echo, echo -n等), 尽量少的使用转义字符;
4. 如果需要变量代换等, 尽量使用字符串连接运算符, 并且按照1-3, 尽量避免双引号;
5. 需要嵌入子表达式, 输出类似TAB制表符等字符时, 使用双引号.
我的规则很简单, 因为双引号支持变量展开和转义序列, 这使得字符串的字面值和实际输出是完全不同的. 往往这样的变化对于脚本编写者会造成很多不必要的麻烦, 最大程度的阻止你的脚本进行这两种操作, 将这两种操作放到明面上, 都会降低脚本的错误可能. 以上只是本人的习惯, 在PowerShell中只要使用"+"就可以连接字符串了, 而Bash更简单, 直接连着写就行, 例如echo "This "'is '" A"' Test!'. 好了, 我们现在来看看PowerShell的几个例子吧:
PS C :> $num = 8250
PS C :> " 试试双引号的变量代换, 变量$num "
试试双引号的变量代换 , 变量8250
PS C :> " 使用转义序列来阻止变量代换, 变量`$num中的值$num "
使用转义序列来阻止变量代换 , 变量 $num中的值8250
PS C :> " 看看`t`t制表符TAB啥样子. "
看看 制表符TAB啥样子 .
PS C :> " 看看换行吧...`n "
看看换行吧 ...
PS C :> " 连续使用两个双引号看看 "" 看到效果了嘛? "
连续使用两个双引号看看 " 看到效果了嘛?
PS C:> " 双引号中使用单引号呢 ? 不需要转义的哦 >> ' <<"
双引号中使用单引号呢?不需要转义的哦>> ' <<
PS C :> " 今天的日期是$dt "
今天的日期是09 / 27 / 2007 10 : 46 : 47
好了, 聪明的大家已经对单引号, 双引号的基本点有了认识, 下一次, 我们再来做真正的纵向对比. 在Bash, Perl, PowerShell中单引号, 双引号进行对比.
此外, 还会为大家介绍Here-String, 这个东西和Bash中的Here-Document类似. 其实你可以把他们当作特殊的转义序列来看待. 下次见^_^