编写我的第一个脚本,所以我确定这是一个基本问题,但有人可以向我解释为什么我可以:
cd ~
cd bin
cd ~/bin
cd 'bin'
但不是
cd '~'
cd '~/bin'
我需要cd
一个目录路径,其中一个目录名称中有一个空格,所以我需要引号(它是Program Files
wine下的Windows)。我可以用两个命令绕过它cd
,但为什么我不能加上~
引号?
如果我输入cd '~'
(或cd "~"
)我得到:
bash: cd: ~: No such file or directory
正如@karel 在他的回答中指出的那样,
~
是一个特殊字符,并由 Bash 扩展到当前用户的主目录中。请参阅Bash 的“波浪号扩展”手册man bash
,或在手册页 ( )中搜索标题“波浪号扩展” 。任何类型的引用都
~
可以防止这种波浪扩展。要回答您有关如何仍将其用于
cd
名称中带有空格的目录的问题,有几种选择:省略引号并使用反斜杠转义空格:
引用路径的其余部分,但在波浪号和第一个斜杠周围省略它们:
如您所见,您可以在 Bash 中连接带引号和不带引号的字符串,只需将它们彼此相邻编写,中间不带任何空格。
使用环境变量
$HOME
而不是波浪号,它仍然在“双引号”(但不是“单引号”)内扩展:~ 是一个特殊字符,shell 将其解释为登录用户的主目录。'~' 被 shell 解释为文字 ~ 字符,而不是登录用户的主目录,因为将字符串包含在两个单引号字符内会导致该字符串被解释为文字文本字符串。
这是一个
bash
称为波浪号扩展的功能。引用man bash
:为了使扩展起作用,波浪号字符
~
需要不加引号,否则该字符将按字面意思表示,并且cd
如果~
当前目录中没有命名的目录则失败。有关引用 in 的解释,请参阅这个详尽的答案bash
。如果您需要引用部分路径,则可以:至少引用需要用单引号引用的字符,例如
或者
至少引用需要用双引号引用的字符,例如
或者
仅引用需要用反斜杠引用的字符,例如
波浪号扩展有一些更有趣的功能,例如:
~+
展开为 的值PWD
,即当前工作目录~-
展开为 的值OLDPWD
,即前一个工作目录~john
展开到与登录名“john”关联的主目录echo
使用命令探索探索 bash 中的工作原理的最简单方法是使用
echo
命令。在~
使用这个的情况下:如您所见,当您使用单引号或在其周围使用双引号时,
~
它会按字面意思解释为字符串,而不是扩展为变量。当您使用反引号 (`) 时,它会作为命令执行并生成错误消息。