在 bash 中匹配带有空格的字符串

在 bash 中匹配带有空格的字符串

我有以下字符串及其路径:

#!/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

答案1

分析

在麻烦的命令中:

cp -p $FICHERO_MARCADOR ./marcadores-google-crome

该变量未加引号。应该用双引号引起来

如果您$variable在应该加引号的地方不加引号,那么变量本身就无法阻止单词拆分或文件名生成。变量中的反斜杠和引号都无关紧要;变量中的任何内容实际上也无关紧要。重要的是,在$variable展开之前没有加引号。

在定义变量时,应保护要存储在变量中的字符串中的空格不被解释为分隔符。您确实通过双引号保护了它,这个想法很好。为了比较:语法

var=foo bar

在环境中运行。要存储bar,应引用:var=foofoo bar

var="foo bar"
# or
var='foo bar'

(在这个例子中,仅引用空格就足够了var=foo' 'bar:)

或者退出空间:

var=foo\ bar

注意var="foo\ bar"不同,引号足以保护空格,并且引用的反斜杠存储在变量中。(一般来说,双引号内的反斜杠可能是特殊的,也可能不是特殊的,这取决于下一个字符。如果下一个字符是空格,那么反斜杠就是文字;这里就是这种情况。)

我想你做到了

FICHERO_MARCADOR="/Users/javier/Library/Application\ Support/Google/Chrome/Default/Bookmarks"

希望变量中的反斜杠稍后能保护空格。正如我所说,变量中的反斜杠对于 shell 来说并不特殊。您cp获得的参数比您预期的要多。

当您在命令行中逐字输入反斜杠时,您的尝试ll成功了,因为这个反斜杠很特殊。它不是来自变量。它与var=foo\ bar上面提到的反斜杠一样特殊。


解决方案

要修复代码,请在分配给变量时以一种异或另一种方式保护空间。然后用双引号括住变量:

#!/bin/bash
FICHERO_MARCADOR="/Users/javier/Library/Application Support/Google/Chrome/Default/Bookmarks"
cp -p "$FICHERO_MARCADOR" ./marcadores-google-crome

边注

避免使用大写变量名称。如果你习惯了它们,那么迟早你可能会改变PATH某些脚本中的另一个重要的环境变量,而脚本的其余部分将会失败。

相关内容