首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash中,在for循环中使用数组

在bash中,在for循环中使用数组
EN

Stack Overflow用户
提问于 2015-12-18 00:13:32
回答 4查看 118关注 0票数 0

我目前正在编写一个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意外(期待“)

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-18 00:20:47

这是怎么回事?

代码语言:javascript
复制
files=$($DOWNLOADDIRECTORY/*)

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

According to this answer,您希望省略获取文件数组的第一个$

代码语言:javascript
复制
files=($DOWNLOADDIRECTORY/*)

我刚写了一个示例脚本

代码语言:javascript
复制
#!/bin/sh
alist=(/*)
printf '%s\n' "${alist[@]}"

输出

代码语言:javascript
复制
/bin
/boot
/data
/dev
/dist
/etc
/home
/lib
....
票数 2
EN

Stack Overflow用户

发布于 2015-12-18 00:23:43

您正在尝试以命令的形式执行glob。使用数组的语法是array=(tokens)

代码语言:javascript
复制
files=("$DOWNLOADDIRECTORY"/*)
files=("${files[@]##*/}")

您还试图使用sh而不是bash运行脚本。

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

相反,请使用bash file#!/bin/bash

票数 3
EN

Stack Overflow用户

发布于 2015-12-18 00:25:45

您的任务不是创建数组。您需要arrayname=( values for array )作为表示法。因此:

代码语言:javascript
复制
files=( "$DOWNLOADDIRECTORY"/* )
files=( "${files[@]##*/}" )

第一行将给出$DOWNLOADDIRECTORY指定的目录中的所有名称。第二个要小心地删除目录前缀。为了清楚起见,我在(之后和)之前使用了空格;shell既不要求也不需要对象。我在变量名称和展开周围使用双引号,以便在名称包含空格等情况下保持正常。

虽然目前还不清楚为什么要这样做,但它的优势在于它在文件名中保留了空格等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34346614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档