bash 扩展添加单引号导致错误

bash 扩展添加单引号导致错误

我有一个命令来挂载cifs文件共享。共享路径和挂载点在 bash 脚本中添加了变量,如下所示;

sudo mount -t cifs -o user="$USERNAME",cruid="$USERNAME",sec=krb5 "$FILEPATH" "$DFS_MOUNT"

但是,运行脚本时命令失败了?我只能假设这是由于在运行脚本时添加了单引号而导致的,以便bash -x检查它?

最终看起来像;

sudo mount -t cifs -o user=chris,cruid=chris,sec=krb5 '//toolshed/Windows/Utilities/Uninstall\ Problems\ Fixit' /home/chris/fixit

哪些原因会导致出现“未找到路径”的故障?

因为如果我运行命令; sudo mount -t cifs -o user=chris,cruid=chris,sec=krb5 //toolshed/Windows/Utilities/Uninstall\ Problems\ Fixit /home/chris/fixit

它工作正常

答案1

它看起来$FILEPATH扩展为一个包含反斜杠()的字符串\,这些反斜杠看起来好像是为了转义后面的空格。

双引号$FILEPATH被变量值替代,不会进行进一步的分词。其内容。即使不加引号,这些反斜杠在变量扩展后也不会转义空格。

bash -x显示添加了单引号的命令,以减少歧义。单引号是给您的,mount我没有看到它们。但是,反斜杠被发送到,mount因为它们在变量的内容中。这样,该工具请求了一个不存在的路径。

正确的做法是首先分配文字字符串:

FILEPATH='//toolshed/Windows/Utilities/Uninstall Problems Fixit'

然后使用双引号中的变量(如您所做的那样)"$FILEPATH":。


请注意这也会起作用:

FILEPATH=//toolshed/Windows/Utilities/Uninstall\ Problems\ Fixit

但是这些反斜杠现在在解析赋值时转义空格,它们不会保留到变量内容中。对您有用的命令中未加引号的反斜杠以相同的方式解析,它们没有保留到mount

您的问题是反斜杠在变量的内容中。也许您做了类似的事情:

FILEPATH='//toolshed/Windows/Utilities/Uninstall\ Problems\ Fixit'   # 您的案例是错误的

请注意lowercase使用变量是一种很好的做法

相关内容