linux - 避免在 bash 中使用数组进行通配符扩展
问题描述
我写了以下代码:
join(){
IFS="$1"
shift
echo "$*"
}
FILES=(/tmp/*)
SEPARATED_FILES=$(join , ${FILES[*]})
echo $VAR
它可以很好地打印逗号分隔的文件列表/tmp
。但我想重构它并消除FILES
作为数组的 tmp 全局变量。我尝试了以下方法:
SEPARATED_FILES=$(join , ${(/tmp/*)[*]})
echo $VAR
但它会打印以下错误:
line 8: ${(/tmp/*)[*]}: bad substitution
解决方案
是的!您可以通过将 glob 作为参数直接传递给函数来避免它。请注意,glob 结果在传递给函数之前由 shell 扩展。因此,将第一个参数作为IFS
您要设置的参数,将第二个参数作为您要使用的 glob 表达式。
join , /tmp/*
在调用函数之前,将 glob 扩展为文件名。
join , /tmp/file1 /tmp/file2 /tmp/file3
上面的一个值得注意的补充是在调用函数之前使用nullglob
选项。因为当 glob 不产生任何结果时,可以安全地忽略未展开的字符串。
shopt -s nullglob
join , /tmp/*
并在命令替换语法中为
fileList=$(shopt -s nullglob; join , /tmp/*)
从你的努力中得到了一些收获。
- 除非您有理由不这样做,否则始终将 shell 引用应用于变量/数组。这样做可以保留内部内容的字面值并防止发生分词
- 始终为用户定义的变量/函数和数组名称使用小写名称
推荐阅读
- ios - 如何从 Firebase Deeplink 网站重定向用户
- google-apps-script - Google 表格插件——欺骗性的消息后 URI
- android - 如何使用辅助功能代表调整语音?
- jquery - 无法使用 jQuery 将文件上传到 ASP.NET MVC
- php - 如何在两个消息模板中显示参考组?
- python - django - 当我想在卡片/索引页面上显示内容时,我没有从数据库中看到任何内容
- node.js - Windows 中的“nvm use”命令有什么作用?
- swift - “半开范围算子”的“单边形式”
- python - django-telegrambot 无法使用 WEBHOOK 模式捕获所有转发的消息
- python - Pandas 组合多列(使用 NoneType)