Bash glob 扩展,如 echo $pathInVar*

标签 bash glob expansion

我有一个包含路径的变量,并想根据该路径扩展一个 glob 模式。我想了解为什么我的尝试不起作用以及在 bash 中执行此操作的首选方法是什么。
EX :我想列出我的主目录中的所有文本文件,或者只列出那些以“test”开头的文件。我失败的尝试:

foo="~/"
echo $foo*.txt
echo ${foo}test*.txt
这些结果在字符串输出 ~/* 中和 ~/test*txt分别。我尝试了不同的版本,包括引号等,但我想这足以说明我的问题和理解水平——我是一个 bash 初学者。问题是否与波浪号扩展与使用 $HOME 相关?
最终,我想遍历这些文件,但我问这个问题是为了理解 bash,而不仅仅是得到结果。
附言我确信已经有答案了,但我还没有找到任何帮助我理解这个案例的答案。我试图了解 bash 中的一般扩展顺序,但仍然不明白如何在此处应用它。

最佳答案

在一个球体中,*匹配文件名中的任何字符,但它确实 不是 匹配 / .因此,要获取主目录中的文件,请尝试:

foo=$HOME
echo $foo/*.txt
echo ${foo}/test*.txt
在奇数情况下 foo ( $HOME ) 包含 shell-active 字符,更好的做法是使用:
echo "$foo"/*.txt
echo "${foo}"/test*.txt
要循环这些文件,请使用:
for fname in "$foo"/*.txt
do
    # do something
done
这种循环结构对于所有文件名都是安全的,即使是带有空格或其他 shell 事件字符的文件名。当然,这假设循环中的代码具有 $fname根据需要在双引号内。
更新修改后的问题
foo="~/"
~/在引号内时永远不会扩展:
$ foo="~/"
$ echo $foo
~/
如果你真的想用~/ , 不要使用引号。除非你想使用 ~ 的奇特功能之一,通常使用 $HOME 更简单、更可靠。反而。

关于Bash glob 扩展,如 echo $pathInVar*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63678680/

相关文章:

ruby - 如何获取模式匹配目录Ruby中的特定文件

node.js - glob 匹配除顶级供应商或任何深度的 node_modules 之外的所有文件

bash - 如何防止bash中for循环中的文件名扩展

scala - Scala 2.8 规范§6.26.5 Eta 扩展中的 "Maximal Sub-expression"是什么?

linux - 在非常大的文件系统上获取每个文件的文件大小

bash - Automator bash shell 脚本问题

bash - 在/dev/stdout 上运行用户和权限被拒绝

bash - 使用awk对ngram单词进行排序

php - 检查 php 目录是否包含不同的文件类型

c - 像宏这样的函数需要强制括号吗?引用 GCC cpp 手册后我很困惑