mar*_*cel 0 shell scripting bash
我已经编写了下面的脚本,但是当我从它所在的目录(以及文件)运行它时
bash xmlimport-magento2.sh
我收到此错误消息:
xmlimport-magento2.sh: line 7: syntax error near unexpected token $'do\r''
mlimport-magento2.sh: line 7: do
#!/bin/bash
if exists *.ZIP
then
# disable autoindexing
#php -f "$MAGEPATH"shell/indexer.php -- --mode-manual all
for file in `ls *.ZIP`
do
# Backup zip file
cp $file /backups
# Extract XML files
unzip -P web $file
# Delete zip file
rm -f $file
# rename xml files
# hier komt procedure die controleert of bestand xxx*basic.xml bestaat en zo ja dan wordt dit bestand hernoemt en daarna geexecuteerd
if [ -f "*basic.xml" ]
then
mv *_BASIC.XML BASIC.XML
php -f bin/magento import:job:run 1
fi
# rename xml files
# hier komt procedure die controleert of bestand xxx*prices.xml bestaat en zo ja dan wordt dit bestand hernoemt en daarna geexecuteerd
if [ -f "*prices.xml" ]
then
mv *_PRICES.XML PRICES.XML
php -f bin/magento import:job:run 4
php -f bin/magento import:job:run 2
fi
# rename xml files
# hier komt procedure die controleert of bestand xxx*stock.xml bestaat en zo ja dan wordt dit bestand hernoemt en daarna geexecuteerd
if [ -f "*stockinfo.xml" ]
then
mv *_STOCKINFO.XML STOCKSTOCK.XML
php -f bin/magento import:job:run 3
fi
done
# verplaats .XML files naar backup
cp -f $file ../backups
# Delete XML files
rm -f *.XML
fi
Run Code Online (Sandbox Code Playgroud)
首先,CRLF 换行有一个明显的问题,\r错误消息中的 是一个明显的标志。参见例如如何在 Unix 和 Windows 换行符格式之间批量转换文件系统分支中的所有文件?关于如何解决这个问题。
那么,你有
if exists *.ZIP
then
Run Code Online (Sandbox Code Playgroud)
这也可能是 DOS 主义,至少我没有听说过一个名为exists.
也在这里:
for file in `ls *.ZIP`
Run Code Online (Sandbox Code Playgroud)
是无用的使用ls。发生的情况是 shell 扩展了文件名模式*.ZIP,将结果传递给ls...只是打印出相同的名称。除非您遇到结果的分词问题。
而不是这两个,使用:
shopt -s nullglob
for file in ./*.ZIP; do
...
done
Run Code Online (Sandbox Code Playgroud)
首先,shell 非常有能力列出匹配的文件名(这是您在上面对 所做的exists *.ZIP)。然后,nullglob如果没有匹配的文件,Bash会使模式扩展为空。否则,您可能会收到有关字面上称为*.ZIP不存在的文件的错误。为模式添加前缀./会使以破折号开头的文件名的一些潜在问题消失。
此外,您一直使用不带引号的扩展$file,即rm -f $file, 而不是rm -f "$file"。这也会导致分词问题,请参阅:
还,
if [ -f "*basic.xml" ]
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为引号阻止模式被扩展为实际文件名。它将查找字面上称为*basic.xml. 如果您确定只能有一场比赛,那么if [ -f *basic.xml ]可以。如果有更多,那会产生错误,因为测试会得到太多参数。
此外,这可能会出错,除非BASIC.XML是现有目录。
mv *_BASIC.XML BASIC.XML
Run Code Online (Sandbox Code Playgroud)
好的,我认为建议将脚本分成较小的部分并单独测试(可能会加入一些调试输出),这将是一个好主意。
| 归档时间: |
|
| 查看次数: |
2092 次 |
| 最近记录: |