微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

让bash解释存储在包含文件路径的变量中的双引号

如何解决让bash解释存储在包含文件路径的变量中的双引号

我想捕获一个在 bash 变量中包含空格的目录,并将其传递给 ls 命令, 用双引号将变量 deference 括起来。以下是说明问题的两个示例。示例 1 有效,但它涉及输入双引号。示例 2 不起作用,但我希望它起作用,因为那样我可以避免输入双引号。

示例 1,用引号将变量括起来,如 How to add path with space in Bash variable解决方案中,它没有解决问题:

[user@machine]$ myfolder=/home/username/myfolder\ with\ spaces/
[user@machine]$ ls "$myfolder"
file1.txt file2.txt file3.txt

例2,带引号的变量部分,也没有解决问题。根据我的理解,在这个例子中,在抛出错误之前发送给ls命令的第一个引号字符:

[user@machine]$ myfolder=\"/home/username/myfolder\ with\ spaces/\"
[user@machine]$ ls $myfolder
ls: cannot access '"/home/username/myfolder': No such file or directory

在示例 2 中,错误消息表明第一个双引号已发送到 ls 命令,但我希望这些引号由 bash 而不是 ls 解释。有没有一种方法可以更改 myfolder 变量,以便第二行的行为完全如下:

[user@machine]$ ls "/home/username/myfolder with spaces/"

目标是以这样的方式制作 myfolder 变量:(1) 它不需要被任何字符包围,(2) ls 命令将列出它代表的现有目录。

动机是有一个有效的速记,将包含空格的长目录路径传递给命令行上的可执行文件,并使用尽可能少的字符 - 所以如果可能的话,不要使用双引号。

解决方法

假设在 ls 命令之前有一些“额外”字符是可以接受的:

$ mkdir /tmp/'myfolder with spaces'
$ touch /tmp/'myfolder with spaces'/myfile.txt

$ myfolder='/tmp/myfolder with spaces'
$ myfolder=${myfolder// /?}               # replace spaces with literal '?'
$ typeset -p myfolder
declare -- myfolder="/tmp/myfolder?with?spaces"

$ set -xv
$ ls $myfolder
+ ls '/tmp/myfolder with spaces'
myfile.txt

这是一个fiddle

当然,? 将匹配任何单个字符,但是您有多个目录/文件名称相似,唯一的区别是空格与非空格的可能性有多大?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。