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

Have bash interpret double quotes stored in variable containing file path

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

示例 1,用引号将变量括起来,如 的解决方案,它没有解决问题:

[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 命令将列出内容它代表的现有目录。

动机是为了高效 shorthand 以尽可能少的字符将包含空格的长目录路径传递给命令行上的可执行文件 - 所以如果可能的话不使用双引号。

假设 ls 命令之前的一些 'extra' 个字符是可以接受的:

$ 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

当然,? 将匹配任何单个字符,但是您有多个具有相似名称的 directories/files 的可能性有多大,唯一的区别是 space 与非 space?