我目前正在编写一个bash脚本,我必须从我们的mySQL数据库下载文件,将它们存放在不同的地方,然后用图像的新位置更新数据库。最后一部分是我的问题区域,创建充满文件名的数组并遍历它们,然后在数据库中替换文件名。
不管是什么原因,我总是犯这样的错误:
未找到/X2b6qZP.png: 1: /xxx/映像/X2b6qZP.png:?PNG /xxx/映像/X2b6qZP.png: 2: /xxx/映像/X2b6qZP.png: not found /xxx/映像/X2b6qZP.png: 1: /xxx/映像/X2b6qZP.png:语法错误: word意外(期待“)
files=$($DOWNLOADDIRECTORY/*)
files=$(${files[@]##*/})
# Iterate through the file names in the download directory, and assign the new values to the detail table.
for file in "${files[@]}"
do
mysql -h ${HOST} -u ${USER} -p${PASSWORD} ${DBNAME} "UPDATE crm_category_detail SET detail_value = 'http://xxx.xxx.x.xxx/img/$file' WHERE detail_value LIKE '%imgur.com/$file'"
done发布于 2015-12-18 00:20:47
这是怎么回事?
files=$($DOWNLOADDIRECTORY/*)我不认为这是在做你认为它正在做的事情。
According to this answer,您希望省略获取文件数组的第一个$。
files=($DOWNLOADDIRECTORY/*)我刚写了一个示例脚本
#!/bin/sh
alist=(/*)
printf '%s\n' "${alist[@]}"输出
/bin
/boot
/data
/dev
/dist
/etc
/home
/lib
....发布于 2015-12-18 00:23:43
您正在尝试以命令的形式执行glob。使用数组的语法是array=(tokens)。
files=("$DOWNLOADDIRECTORY"/*)
files=("${files[@]##*/}")您还试图使用sh而不是bash运行脚本。
不要运行sh file或使用#!/bin/sh。sh中不支持数组。
相反,请使用bash file或#!/bin/bash。
发布于 2015-12-18 00:25:45
您的任务不是创建数组。您需要arrayname=( values for array )作为表示法。因此:
files=( "$DOWNLOADDIRECTORY"/* )
files=( "${files[@]##*/}" )第一行将给出$DOWNLOADDIRECTORY指定的目录中的所有名称。第二个要小心地删除目录前缀。为了清楚起见,我在(之后和)之前使用了空格;shell既不要求也不需要对象。我在变量名称和展开周围使用双引号,以便在名称包含空格等情况下保持正常。
虽然目前还不清楚为什么要这样做,但它的优势在于它在文件名中保留了空格等。
https://stackoverflow.com/questions/34346614
复制相似问题