Mysql 在bash中的for循环中使用数组
我目前正在编写一个bash脚本,在这个脚本中,我必须从mySQL数据库下载文件,将它们存放在不同的位置,然后用图像的新位置更新数据库。最后一部分是我的问题区域,创建一个满是文件名的数组并遍历它们,在执行时替换数据库中的文件名 无论出于什么原因,我总是会遇到这样的错误: 未找到/X2b6qZP.png:1:/xxx/images/X2b6qZP.png:?png/xxx/images/X2b6qZP.png:2:/xxx/images/X2b6qZP.png::未找到 /xxx/images/X2b6qZP.png:1:/xxx/images/X2b6qZP.png:语法错误:word意外Mysql 在bash中的for循环中使用数组,mysql,arrays,bash,Mysql,Arrays,Bash,我目前正在编写一个bash脚本,在这个脚本中,我必须从mySQL数据库下载文件,将它们存放在不同的位置,然后用图像的新位置更新数据库。最后一部分是我的问题区域,创建一个满是文件名的数组并遍历它们,在执行时替换数据库中的文件名 无论出于什么原因,我总是会遇到这样的错误: 未找到/X2b6qZP.png:1:/xxx/images/X2b6qZP.png:?png/xxx/images/X2b6qZP.png:2:/xxx/images/X2b6qZP.png::未找到 /xxx/images/X2
这是怎么回事
files=$($DOWNLOADDIRECTORY/*)
我不认为这是在做你认为它在做的事情
,您希望省略第一个$以获取文件数组
files=($DOWNLOADDIRECTORY/*)
我刚刚写了一个示例脚本
#!/bin/sh
alist=(/*)
printf '%s\n' "${alist[@]}"
输出
/bin
/boot
/data
/dev
/dist
/etc
/home
/lib
....
您正试图将glob作为命令执行。使用数组的语法是array=tokens: 您还尝试使用sh而不是bash运行脚本 不要运行sh文件或使用/bin/sh。sh中不支持数组
而是使用bash文件或/bin/bash 您的作业没有创建数组。您需要arrayname=数组的值作为表示法。因此:
files=( "$DOWNLOADDIRECTORY"/* )
files=( "${files[@]##*/}" )
第一行将给出$DOWNLOADDIRECTORY指定的目录中的所有名称。第二种方法小心地删除了目录前缀。
为了清晰起见,我在前后使用了空格;外壳既不需要也不需要对象。我在变量名和扩展名周围使用了双引号,以便在名称中包含空格等时保持正常
虽然不清楚您为什么会这样做,但它比许多其他方法的优点是它在文件名中保留了空格等。您可以直接在文件上循环:
for file in "$DOWNLOADDIRECTORY"/*; do
file="${file##*/}" # or file=$(basename "$file")
# MySQL stuff
done
在路径中出现空格时添加了一些引号。$DOWNLOADDIRECTORY/*不是命令,您只需要对其进行参数扩展,不是吗?@BenjaminW。正确,$DOWNLOADDIRECTORY只是/tmp/images的变量。我正在尝试从该目录中创建一个文件名数组。这正是要做到的,试试看。太棒了,非常感谢。现在,如果我遍历数组,在mySQL文本中插入$files,它会使用文件名吗?试试看。我的建议是将sql文本分配给一个变量,然后在mysql命令中使用该变量。这样,您可以轻松地回显查询字符串以查找可能的问题。干杯,快乐编码。
files=( "$DOWNLOADDIRECTORY"/* )
files=( "${files[@]##*/}" )
for file in "$DOWNLOADDIRECTORY"/*; do
file="${file##*/}" # or file=$(basename "$file")
# MySQL stuff
done