gpt4 book ai didi

bash - 作为命令参数连接的字符串

转载 作者:行者123 更新时间:2023-11-29 09:23:02 25 4
gpt4 key购买 nike

在 bash shell 中,我想列出 $folder(我代码中的变量名)下的文件名和完整路径。

但是,如果我这样编码,

dir $folder"*"

它输出错误

"dir: cannot access <folder_name> : No such file or directory"

如果我像这样更改代码,它会起作用,

search_str=$folder"*"
dir $search_str

似乎连接到 dir 命令的字符串不是我想要的,如果我将字符串存储在一个变量中并将它仅传递给 dir 命令,它就可以工作。

有谁知道不使用 search_str 的原因和方法吗?

最佳答案

注意:我使用的是标准 Unix 实用程序 ls 而不是 GNU-specific utility dir (谢谢,hek2mgl)在下面的示例中,因为该问题与通用 shell 行为有关,并且不限于具有 GNU 实用程序的平台。

tl;dr

ls "$folder"* # double-quote the var. reference, use * unquoted

* 等模式(通配)元字符必须未加引号才能被识别。

因此,ls $folder"*" 总是不会按预期工作,因为您(双)引用 *

相比之下,变量赋值 search_str=$folder"*" 导致 * 附加到 $folder 的值(如一个 literal,因为它是双引号,但最终没有引号,因为 shell 在字符串连接过程中删除了双引号,因为它们具有 句法 含义而不是文字;这种删除被恰本地称为引号删除)。

ls $search_str 命令中不加引号使用变量,然后使 * 作为通配符有效(模式元字符)。

但是,这种未加引号的变量使用本质上不稳健,因为 $search_str 的值作为一个整体 不仅受到 globbing 的影响,而且受到 word-splitting 的影响,这意味着如果原始 $folder 变量包含带有 嵌入空间

因此,当实际需要通配时,最好附加 * 按需:

ls "$folder"*

请注意 * 是如何不加引号的 - 使其作为模式元字符有效 - 而 "$folder" 是有意双引号 -以确保它按原样使用(分词和通配不应用于其值)。

关于bash - 作为命令参数连接的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41134088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com