PowerShell的单引号和反引号

作者: Edengundam(马涛)

今天思考了很久, WMI对于Windows来说是非常重要的一个工具. 包含了很多特性, 目前我正在看WMI关于事件和WQL的资料. PowerShell在今后也会提供WMI的供应程序(provider). 

不过今天我想介绍PowerShell的单引号和反引号, 以及与Bash, Perl之间的一些对比. 学习任何事务时候, 开始用的是相似性进行记忆, 但是随着知识的积累, 你最终还会一定会引入对比记忆. 不过根据笔者在学习C, C#, bash, Perl, PowerShell的过程中, 始终认为, 首先应该以相似性为主. 这点在我学习BRE, ERE, ARE, 即基本正则表达式(废弃), 扩展正则表达式(现代正则表达式), 高级正则表达式时, 给我印象最为深刻.

如果您对bash, Perl不了解, 也没有关系, 之所以要对比, 只是为了告诉您: 伟大的思想, 表现往往是一致的. 再稍后, 我会单独来讲双引号. 其实只要记住规则, PowerShell中的引号可要比bash的简单很多了(准确说是传统的sh, 因为bash中最好使用'$()', 而避免反引号的使用).

在bash, Perl, PowerShell中, 对引号的比较往往涉及如下三个方面: 变量展开(也被称为: 变量代换, 变量篡改. ), 转义字符, 引号自身.

 

 
变量代换
转义字符支持程度
单引号自身引用
Bash
不允许
不允许
不允许
Perl
不允许
允许两种,见注1
见注1
PowerShell
不允许
不允许
见注2
 注1: Perl语言中, 单引号中允许出现两种转义序列: “//”和”/’”, 通过此方法, 可以在单引号中, 引用单引号.
注2: PowerShell中, 采取了一种更加通用的方法来引用单引号, 这种规则与csv文件, 一些数据库SQL语句语法一致, 既将连续出现的两个单引号当作一个单引号来处理, 请参见例子.

在我们看例子前, 我们先来看看转义字符. 在C, C++, C#, Java, ksh, bash, Perl等等语言中, 转义字符都是反斜线(/). 通过特定语法规则, 使用转义字符可以构建被称为转义字符序列的特殊表达式. 这种表达式, 往往通知语言的词法分析模块, 对该转义序列进行特殊处理.

由于历史原因, Dos, Windows操作系统使用反斜线作为路径的分隔符, 这使得PowerShell团队做出了惊人的抉择, 使用反引号(重音符号)作为转义字符. 这种惊人的不一致, 让有类似我举例语言背景的人们可能很恶心(我的第一反应就是这样). PowerShell团队做出这种无奈的举动也是事出有因的. 如果遵照传统, 那么我们在PowerShell中使用目录时候, 恐怕都要连续使用两个反斜线才能干活, 这恐怕会让我们疯掉>_<. 正如PowerShell团队的架构师所说, 其实用反引号虽然开始不习惯, 但是你只需要几分钟去适应. 反正它都是转义字符而已, 再说转移序列又没有变化^_^.

PowerShell中支持的转移序列有点少, 特别是相比Perl的来说:

`'    单引号
`"    双引号
`0    空值
`a    警报
`b    退格
`f    换页
`n    新行
`r    回车
`t    水平制表
`v    垂直制表

正如你所见到的, 除了转义字符变了, 其他的都没有变. 在Perl中还有一些功能强大的转移序列, 这里我就不再多说, 有兴趣的人可以参考关于Perl的书籍. 这样的转移序列例如: /U, /E, /L, /l, /u.

在我们来看几个例子(转义序列的例子放到下次举例):

PS C:> 'My money is on the way to my Home'
My money is on the way to my Home
PS C
:> $money = 100
PS C
:> 'My $money is on the way to my Home'
My $money is on the way to my Home
PS C
:> 'Test escape sequences: `0'
Test escape sequences
: `0
PS C
:> 'Test escape sequences: `n'
Test escape sequences
: `n
PS C
:> 'Test escape sequences: `r'
Test escape sequences
: `r
PS C
:> 'Test escape sequences: `r`n'
Test escape sequences
: `r`n
PS C
:> 'Test doubling up single quotes: '''
Test doubling up single quotes
: '
PS C:> 
'Test doubling up single quotes: ''End'
Test doubling up single quotes: 
'End
PS C
:> 'Test doubling up single quotes: 'Wrong''
表达式或语句中出现意外标记“Wrong”。
所在位置 行
:1 字符: 41
+ 'Test doubling up single quotes: 'Wrong'' <<<<

我相信, 这些例子对于聪明的您来说, 应该不需要过多解释. 您一定要看清楚"单引号"和"反引号". 经过无数次事实证明(这些证明一般都是别人在论坛求助时发生的, 我曾经遇到过几次), 大部分人, 第一眼看到单引号, 反引号, 双引号时, 会错误的使用另一种引号. 这往往缘于他们对引号的不了解, 如果对引号的特性很清楚, 在看到引号时, 代码编写者的意图, 您也一定猜测到了.

OK, 由于明天要去看病, 今天只啰唆这么多, 希望大家喜欢. 引号, 往往在bash中就是判断一个人水平的好考点. 因此希望大家能予以重视.

<think>好的,用户的问题是关于如何在设置环境变量时正确添加引号。我需要结合他们提供的引用内容来解答这个问题。首先,用户提到了三个引用,其中引用[1]是关于Shell中declare命令的参数,引用[2][3]涉及环境变量配置时引号的使用情况。 首先,我应该确定不同操作系统下的处理方式。因为在WindowsLinux/Unix系统中,环境变量的设置方法有所不同,引号的使用规则也可能不同。用户提供的引用[2]提到了Java环境变量配置中使用wmic命令的例子,其中路径被引号包裹,但变量值使用了%xx%的形式。这可能意味着在Windows命令提示符或PowerShell中如何处理带空格的路径需要引号。 接下来,引用[3]提到Postman设置环境变量时获取token并自动更改,这里可能需要确保变量值中的引号被正确处理,特别是在JSON或脚本中可能需要转义。 我需要分步骤说明不同场景下的正确做法: 1. **Windows命令行(CMD)**:当路径包含空格时,通常需要用双引号包裹整个路径,但在设置变量时,引号会被当作值的一部分。例如,使用`setx`命令时,如果值本身需要包含引号,可能需要转义或使用不同的语法。 2. **PowerShell**:在PowerShell中,变量赋值时如果值有空格,需要使用双引号,且内部引号需要转义。例如,`$env:MyVar = "Value with spaces"`或者包含内部引号时用引号转义。 3. **Linux/Shell**:在Bash中,赋值变量时通常不需要引号,但如果值包含空格或特殊字符,应使用双引号单引号会保留字面值,而双引号允许变量扩展。例如,`export MY_VAR="value with spaces"`。 4. **编程或脚本环境(如Postman)**:在JavaScript中设置环境变量时,如果值需要包含引号,应使用转义字符,例如`pm.environment.set("token", "\"abc123\"")`,这样存储的值会包括双引号。 另外,需要提醒用户注意不同环境下引号的处理差异,避免因为引号使用不当导致路径解析错误或变量值不正确。例如,在Windows中使用`setx`命令时,如果路径有空格但不加引号,可能导致截断,而正确的方法是将整个路径用引号包裹,但要注意命令解析的方式。 可能还需要检查用户提供的引用内容中的例子,比如引用[2]中的命令`wmic ENVIRONMENT where "name='Path' and username=''" set VariableValue=%xx%`,这里的变量值%xx%是否应该包含引号?可能需要解释在这种情况下是否需要转义或如何正确包裹路径。 最后,总结在不同情况下正确添加引号的方法,并强调测试环境变量值是否正确的重要性,比如通过echo命令或打印变量来验证是否包含预期的引号。</think>### 如何正确为环境变量值添加引号? 在设置环境变量时,**引号的使用取决于具体场景操作系统**。以下是常见场景的解决方法: --- #### 1. **Windows 系统(CMD/PowerShell)** - **包含空格的路径**: 若变量值包含空格(如路径),需用双引号包裹整个值,但需注意引号是否会被解析为值的一部分: ```cmd :: CMD中,引号会被保留为值的一部分 setx MY_PATH "C:\Program Files\App" ``` - 实际存储值:`"C:\Program Files\App"`(包含引号) - 若需去除引号,需在代码中处理,例如: ```python import os path = os.environ["MY_PATH"].strip('"') ``` - **PowerShell 中转义引号**: 使用引号`"`或单引号`'`包裹值: ```powershell # 双引号内嵌套引号需转义 $env:MY_VAR = "He said: `"Hello`"" # 或使用单引号 $env:MY_VAR = 'He said: "Hello"' ``` --- #### 2. **Linux/Unix 系统(Bash)** - **变量值包含空格或特殊字符**: 使用双引号包裹值以保留空格,单引号则完全按字面解析: ```bash # 双引号允许变量扩展 export MY_VAR="Value with spaces: $HOME" # 单引号禁止扩展 export MY_VAR='Static value with "quotes"' ``` - **JSON 或脚本中的引号**: 若需在环境变量中存储JSON,需转义内部引号: ```bash export JSON_DATA="{\"key\": \"value\"}" ``` --- #### 3. **编程语言中的处理(如Java、Python)** - **Java 中设置环境变量**: 通过`ProcessBuilder`传递参数时,引号需显式添加: ```java ProcessBuilder pb = new ProcessBuilder("cmd", "/C", "setx", "MY_VAR", "\"quoted value\""); ``` 引用[2]中提到的`wmic`命令需注意参数格式[^2]。 - **Python 中使用 `os.environ`**: 直接赋值时引号会被忽略,需手动添加: ```python import os os.environ["MY_VAR"] = '"quoted string"' ``` --- #### 4. **Postman 等工具中的环境变量** 在Postman中,若需将响应中的带引号值设为环境变量: ```javascript // 提取JSON响应中的token(假设响应为 {"token": "abc123"}) const token = pm.response.json().token; // 存储时添加引号 pm.environment.set("TOKEN", `"${token}"`); ``` 引用[3]中提到的自动更新Token需注意引号转义[^3]。 --- ### 关键总结 - **引号是否作为值的一部分**:取决于命令或脚本的解析方式。 - **验证方法**:通过`echo %MY_VAR%`(Windows)或`echo $MY_VAR`(Linux)检查实际值。 - **编程场景**:需显式处理引号转义。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值