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

时间:2015-12-18 00:13:32

标签: mysql arrays bash

我目前正在开发一个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:语法错误:单词意外(期待")")

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

4 个答案:

答案 0 :(得分:3)

您正在尝试将glob作为命令执行。使用数组的语法是<!doctype html> <html> <head> </head> <body> <div class="content"></div> <footer class="footer"> Hey footer! </footer> </body> </html>

array=(tokens)

您还尝试使用files=("$DOWNLOADDIRECTORY"/*) files=("${files[@]##*/}") 代替sh来运行脚本。

不要运行bash或使用sh file#!/bin/sh不支持数组。

而是使用shbash file

答案 1 :(得分:2)

这是怎么回事?

files=$($DOWNLOADDIRECTORY/*)

我认为这不是你认为它正在做的事情。

According to this answer,您想省略第一个$来获取文件数组。

files=($DOWNLOADDIRECTORY/*)

我刚刚写了一个示例脚本

#!/bin/sh
alist=(/*)
printf '%s\n' "${alist[@]}"

输出

/bin
/boot
/data
/dev
/dist
/etc
/home
/lib
....

答案 2 :(得分:2)

您的作业未创建数组。您需要arrayname=( values for array )作为符号。因此:

files=( "$DOWNLOADDIRECTORY"/* )
files=( "${files[@]##*/}" )

第一行将为您提供$DOWNLOADDIRECTORY指定的目录中的所有名称。第二个小心地删除目录前缀。 为了清楚起见,我在(之后和)之前使用了空格; shell既不需要也不反对它们。我在变量名称和扩展周围使用了双引号,以便在名称包含空格等时保持理智。

虽然为什么你可以做到这一点并不是很明显,但它优于许多替代方案的优势在于它在文件名中保留了空格等。

答案 3 :(得分:0)

你可以直接在文件上循环:

for file in "$DOWNLOADDIRECTORY"/*; do
    file="${file##*/}" # or file=$(basename "$file")
    # MySQL stuff
done

如果路径中有空格,则会添加一些引用。