我目前正在开发一个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
答案 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
不支持数组。
而是使用sh
或bash 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
如果路径中有空格,则会添加一些引用。