我想在 bash 中将变量中的反斜杠 ( \
) 替换为正斜杠 ( /
)。我尝试了以下方法,但不起作用:
home_mf = ${home//(\)//(/)}
例如,我想
\a\b\c -> /a/b/c
答案1
正确的替换是
home_mf="${home//\\//}"
分解如下:
//
替换每一个\\
反斜杠/
和/
削减
示范:
$ t='\a\b\c'; echo "${t//\\//}"
/a/b/c
另一种可能更容易阅读的方法是引用模式('\'
而不是\\
)和替换("/"
而不是简单的/
):
home_mf="${home//'\'/"/"}"
答案2
这将做到这一点:
home_mf=${home//\//\\} # forward to backward slash
home_mf=${home//\\//} # backward to forward slash
例如:
$猫斜线.sh /bin/bash #!/bin/bash 设置-x 主页=/aa/bb/cc home_mf=${主页//\//\\} 回显$home_mf home_mf=${home_mf//\\//} 回显$home_mf $./斜杠.sh + 主页=aa/bb/cc + home_mf='\aa\bb\cc' + 回显'\aa\bb\cc' \aa\bb\cc + home_mf=/aa/bb/cc + 回显 /aa/bb/cc /aa/bb/cc
该${variable/..}
语法是ksh
、,bash
也可能是其他 shell 特有的,但并非所有基于 Bourne shell 语法的 shell 都存在,例如dash
。如果您想要一种可移植的方式(POSIX),您可以改用sed
:
home_mf=$(printf "%s" "$home" | sed 's/\//\\/g') # forward to backward slash
home_mf=$(printf "%s" "$home_mf" | sed 's/\\/\//g') # backward to forward slash