我正在编写一个 bash 脚本来通过 挂载 DFS Windows 共享cifs
。我的主要部分正在工作,但是当我需要用户输入 DFS 路径作为变量并将反斜杠转换为正斜杠时,我遇到了麻烦。
#!/bin/bash
FILE='\\edi3\welshch\test'
FILEPATH="$("$FILE" | sed -e 's/\\/\//gp')"
echo $FILEPATH
我有另一个脚本,它使用命令查找 AD 主目录的文件路径,然后按照部分通过管道传输到 sed| sed -e 's/\\/\//gp
然而上面的脚本给了我;
./test.sh: line 10: \\edi3\welshch\test: command not found
答案1
在命令替换中,有"$FILE" | sed -e 's/\\/\//gp'
,shell 将其扩展为(相当于)'\\edi3\welshch\test' | sed -e 's/\\/\//gp'
。既然它是一个命令,shell 会寻找一个名为\\edi3\welshch\test
运行的文件。
您可能打算使用通过管道传递toecho "$FILE" | sed ...
的内容。FILE
sed
请注意,即使这是不对的,某些版本echo
也会将反斜杠处理为转义字符,从而使事情变得混乱。您需要printf "%s\n" "$FILE" | sed ...
它在所有 shell 中都能工作。看:为什么 printf 比 echo 更好?
另请注意,默认行为sed
是在执行任何操作后打印该行。当您使用/p
ons///
命令时,它会导致额外的打印,因此您会在输出中获得两次结果。
也就是说,由于您使用的是 Bash,因此您可以只使用字符串替换扩展:
#!/bin/bash
FILE='\\edi3\welshch\test'
FILEPATH=${FILE//\\//}
echo "$FILEPATH"
给出输出//edi3/welshch/test
答案2
要替换单个字符,使用起来更简单tr
(1):
FILE=$(echo "$FILE" | tr '\\' / )
答案3
该变量必须输出(通过 echo)到 sed。用于sed -n
抑制 sed 输出。编辑sed -n
-如果我们省略 sed标志则不需要p
。
#!/bin/bash
FILE='\\edi3\welshch\test'
FILEPATH="$(echo "$FILE" | sed 's/\\/\//g')"
echo $FILEPATH