如何解决让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 举报,一经查实,本站将立刻删除。