对于文件路径,Bash字符串将""替换为"\" - 变量扩展

Ale*_*ory 5 bash replace expansion

我知道有更好的方法可以做到这一点.

  1. 有什么更好的方法?

  2. 你如何在bash中对字符串变量进行字符串替换?

例如:(使用php因为这就是我所知道的)

$path = "path/to/directory/foo bar";

$path = str_replace(" ", "\ ", "$path");

echo $path;
Run Code Online (Sandbox Code Playgroud)

收益:

path/to/directory/foo\ bar
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 12

要执行以下特定替换bash:

path='path/to/directory/foo bar'
echo "${path// /\\ }"
Run Code Online (Sandbox Code Playgroud)
  • 分配给变量$时不要使用前缀.bash
  • 周围不允许有空格=.
  • 请注意,path使用引号分配,而字符串替换使用引号 - 这种区别很重要:bash不解释单引号字符串,而您可以在双引号字符串中引用变量(并执行其他操作); (另外,根本没有引用变量引用有其他后果,通常是不期望的 - 通常,双引号变量引用)

字符串替换说明 "${path// /\\ }":

  • 为了对变量执行值替换,首先要将变量名称括起来 {...}
  • //指定要替换以下搜索模式的所有匹配项(仅/用于替换第一个匹配项).
  • /将搜索模式 (a single space), from the replacement string, \\ .
  • 替换字符串必须表示为\\ ,因为\具有特殊含义作为转义字符.因此必须将其自身逃逸以供字面使用.

以上是bash(有点隐蔽)调用shell参数扩展以及参数扩展[参数和]变量扩展的实例.还有更多的风格,例如提取子字符串,提供默认值,剥离前缀或后缀,... - 请参阅主题手册上的BashGuide页面.

至于搜索和替换字符串支持哪些类型的表达式:

  • 搜索表达式是一个通配符图案在文件名扩展中使用的相同类型的(例如,*.txt); 例如,v='dear me'; echo "${v/m*/you}"收益率'dear you'.请注意,将使用最长匹配.
    • 此外,模式的第一个字符在此上下文中具有特殊含义:
      • /正如我们在上面看到的那样,导致模式的所有匹配出现都被替换 - 默认情况下,只替换一个模式.
      • #导致模式的其余部分仅在输入变量的开头匹配
      • %只有在比赛结束
  • 替换表达式是一个字符串,它是受到壳膨胀 ; 虽然支持反向引用,但字符串扩展的事实允许您让替换字符串引用其他变量,包含命令,with $(...),...; 例如:
    • v='sweet home'; echo "${v/home/$HOME}"例如,收益率'sweet /home/jdoe'.
    • v='It is now %T'; echo "${v/\%T/$(date +%T)}"例如,收益率It is now 10:05:17.
    • o1=1 o2=3 v="$o1 + $o2 equals result"; echo "${v/result/$(( $o1 + $o2 ))}"收益率'1 + 3 equals 4'(我认为)

还有更多功能和细微之处 - 请参阅上面的链接.