Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在bash中的for循环中使用数组_Mysql_Arrays_Bash - Fatal编程技术网

Mysql 在bash中的for循环中使用数组

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

我目前正在编写一个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意外


这是怎么回事

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