我知道有更好的方法。
什么是更好的方法?
如何在bash中用字符串替换来操作字符串变量?
例如:(使用php因为这是我所知道的)
$path = "path/to/directory/foo bar";
$path = str_replace(" ", "\ ", "$path");
echo $path;
返回值:
path/to/directory/foo\ bar
在 bash
中执行特定的替换操作:
path='path/to/directory/foo bar'
echo "${path// /\\ }"
bash
中给变量赋值时,不要使用前缀 $
。=
周围不允许有空格。path
是用单引号分配的,而字符串替换发生在双引号中 - 这种区别很重要: bash
不解释单引号字符串,而您可以在双引号字符串中引用变量(和做其他事情); (还有一些其他后果,通常是不希望的 - 通常,请双引号引用您的变量引用)字符串替换的说明 "${path// /\\ }"
:
{...}
中包含变量名//
指定要替换所有出现的搜索模式(使用 /
仅替换第一个出现)。/
将搜索模式
(一个空格)与替换字符串 \\
分开。\
必须表示为 \\
,因为 \
具有转义字符的特殊含义,因此必须为字面使用进行转义。上述是 bash(有点晦涩)称为 shell 参数扩展,也称为 参数扩展 和 [参数和] 变量扩展 的实例。 还有许多其他类型,例如提取子字符串、提供默认值、删除前缀或后缀等 - 请参见BashGuide页面或手册上的主题。
至于在搜索和替换字符串中支持的表达式类型:
*.txt
)。例如,v='亲爱的我'; echo "${v/m*/你}"
将产生'亲爱的你'
。请注意,将使用最长匹配。/
,如上所述,导致替换所有匹配的模式-默认情况下,仅替换第一个模式。#
使其余模式仅在输入变量的开头匹配%
仅在结尾处匹配$(...)
等等;例如:
v='甜蜜的家'; echo "${v/home/$HOME}"
将产生'甜蜜的/home/jdoe'
。v='现在是%T'; echo "${v/\%T/$(date +%T)}"
将产生现在是10:05:17
。o1=1 o2=3 v="$o1 + $o2 equals result"; echo "${v/result/$(( $o1 + $o2 ))}"
将产生'1+3等于4'
(我想)还有许多其他功能和细微差别-请参阅上面的链接。
path="/path/to/directory/foo bar"
是可以的,只要您在使用它时始终引用$path
。 - chepner