我正在尝试创建一个带有文件列表的变量,以便可以迭代它们。我是这样的:
FILES=(`ls *.jpg`)
FILES="${FILES[@]}"
当我运行此脚本时,它只会抛出:
ls: cannot access *.jpg: No such file or directory
我已经找到了其他类似问题的答案,并且我很确定这不是权限问题,因为在前面添加sudo
不会产生任何影响,我是root
。我还检查了脚本本身的权限,它们是-rwxr-xr-x
,所以我觉得在那里很好。
有什么主意我可以解决这个问题吗?
答案 0 :(得分:1)
此Shellcheck干净的代码演示了如何使用文件列表可靠地填充Bash数组:
void paintEvent(QPaintEvent* e) {
QPainter painter{this};
//and now fill the background!
painter.setBrush(QColor(r.value(), g.value(), b.value(), a.value()));
#! /bin/bash -p
shopt -s nullglob # Make globs that match nothing expand to nothing
shopt -s dotglob # Make globs match files whose names start with dot
files=( *.jpg )
declare -p files
可以防止shopt -s nullglob
之类的全局模式在没有任何匹配时扩展为自身。这样的扩展是问题中显示错误消息的原因。运行代码的目录中没有'.jpg'文件,*.jpg
的字面量为ls
,它正确地抱怨文件*.jpg
不存在。 *.jpg
与问题代码一起使用将不起作用,因为在没有shopt -s nullglob
文件的目录中运行它会导致它创建 all 列表。目录中的文件(名称以点开头的文件除外)。如果任何文件名包含空格或glob模式,则该列表将显示为乱码。名称以'-'开头的文件会导致.jpg
做意外的事情。ls
的输出,并且使用它通常很危险。参见why you shouldn't parse the output of ls(1)和Bash Pitfalls #1 (for f in $(ls *.mp3))。ls
确保列表中包含名称以点开头的文件(例如“ .image.jpg”)。如果您不想要,请不要使用。shopt -s dotglob
替换为FILES
是因为大写变量名称可能会与环境变量或shell内置变量发生冲突。参见Correct Bash and shell script variable capitalization。files
仅以清晰明确的方式打印declare -p files
的值。