我在 Windows 10 上工作,并使用 Ubuntu 子系统。我经常需要在 Windows 目录和 Linux 目录之间切换,所以我想编写一个脚本,自动将 Windows 路径转换为 Linux 路径,然后更改目录。我编写了转换脚本,但出于某种原因,我无法将路径传递给 cd。
例子:
$ mkdir temp\ space
$ temp=$(echo "temp\ space") # simulate script that converts path
$ echo $temp
temp\ space
$ cd $temp
-bash: cd: temp\: No such file or directory
编辑:
事后我意识到这其实不是我的问题,我写这个的时候肯定很累,把这个错误引入到我的最小示例中。我真正的问题是我不知道如何在当前 shell 中运行 shell 脚本而不是子 shell。谢谢大家的帮助!
答案1
当您引用字符串时""
,您是在说“使用此字符串”。无需转义空格,因为您已用双引号将字符串括起来。
当你使用终端时不是将字符串封装在引号中,终端希望将空格视为新参数,并感到困惑。你熟悉 CSV 文件吗?想想一个 CSV 文件,其中有一个逗号作为单元格值的一部分。在这两种情况下,我们都需要确保澄清分隔符。而 CSV 文件会使用逗号,bash
而程序通常使用空格来分隔,或者分离命令行参数及其值。
因此,您要么需要用引号括住包含空格的字符串,要么转义字符串中的空格;但不能同时进行。
因此,使用 BASH 变量时有很多“最佳实践”。例如,总是想把它们括在引号里,以解决您遇到的确切问题:
mv thisFile My Space Directory/ # What moves where?
mv thisFile "My Space Directory/" # It is clear what to move where
mv thisFile My\ Space\ Directory/ # Again, clear to the computer
mv thisFile "${tmp}" # Be sure string is not escaped.
通常,仅当您自己直接与终端交互(例如Tab完成或进行其他手动调整)时,才会转义空格。
另外,请注意 bash 对'
和的处理"
略有不同,即'
不允许扩展,而"
允许扩展。例如:
$ BANANA_COUNT=4
$ newVar1="We have this many bananas: ${BANANA_COUNT}"
$ newVar2='We have this many bananas: ${BANANA_COUNT}'
$ echo $newVar1
We have this many bananas: 4
$ echo $newVar2
We have this many bananas: ${BANANA_COUNT}
答案2
您应该使用双引号"
来括住包含特殊字符或空格的文件、文件夹或变量。
根据您提供的示例,情况如下:
~$ mkdir "temp space"
~$ temp=$(echo "temp space")
~$ echo "$temp"
temp space
~$ cd "$temp"
temp space$