我有以下带有以下路径的字符串:
#!/bin/bash
FICHERO_MARCADOR="/Users/javier/Library/Application\ Support/Google/Chrome/Default/Bookmarks"
cp -p $FICHERO_MARCADOR ./marcadores-google-crome
输出:
+ FICHERO_MARCADOR='/Users/javier/Library/Application\ Support/Google/Chrome/Default/Bookmarks'
+ cp -p '/Users/javier/Library/Application\' Support/Google/Chrome/Default/Bookmarks ./marcadores-google-crome
cp: /Users/javier/Library/Application\: No such file or directory
cp: Support/Google/Chrome/Default/Bookmarks: No such file or directory
为什么我不走整条路线并将其分成两部分???因为我这样做是为了不将它分开,因为在脚本之外我以以下方式访问并且它可以工作:
ll /Users/javier/Library/Application\ Support/Google/Chrome/Default/Bookmarks
-rw-------@ 1 javier staff 8,2K 21 jul 17:17 /Users/javier/Library/Application Support/Google/Chrome/Default/Bookmarks
分析
在麻烦的命令中:
该变量未加引号。它应该是双引号。
$variable
如果您在应该引用的位置留下未引用的内容,则变量本身中的任何内容都无法阻止分词或文件名的生成。变量中的反斜杠和引号都不重要;变量中也没有任何东西。重要的是$variable
它在扩展之前没有被引用。在定义变量时,应保护要存储在变量中的字符串中的空格不被解释为分隔符。您确实通过双引号保护了它,这个想法很好。为了比较:语法
bar
在var=foo
环境中运行。要存储foo bar
一个应该引用:(在此示例中,仅引用空格就足够了
var=foo' 'bar
:)或逃离空间:
注意
var="foo\ bar"
不同,引号足以保护空间,并且带引号的反斜杠存储在变量中。(通常,双引号内的反斜杠可能是特殊的,也可能不是特殊的,这取决于下一个字符。如果下一个字符是空格,则反斜杠是文字;这里就是这种情况。)我猜你做到了
希望变量中的反斜杠以后能保护空间。正如我所说,变量中的反斜杠对于 shell 来说并不是特殊的。你
cp
得到的论据比你预期的要多。ll
当您在命令行中逐字键入反斜杠时,您的尝试奏效了,因为这个反斜杠很特殊。它不是来自变量。var=foo\ bar
它和上面提到的反斜杠一样特别。解决方案
要修复您的代码,请在分配给变量时以一种异或另一种方式保护空间。然后双引号变量:
边注
避免使用大写的变量名。如果您习惯了它们,那么迟早您可能会更改
PATH
某些脚本中的另一个重要环境变量,并且脚本的其余部分将失败。