bash shell 脚本错误:意外标记“$'do\r”附近出现语法错误

bash shell 脚本错误:意外标记“$'do\r”附近出现语法错误

我已经编写了下面的脚本,但是当我从它所在的目录(以及文件)运行它时

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

答案1

首先,CRLF 换行符存在明显的问题,\r错误消息中的 是一个明显的标志。参见例如如何在 Unix 和 Windows 换行符格式之间批量转换文件系统分支中的所有文件?关于如何解决这个问题。

那么,你有

if exists *.ZIP
then

这也可能是 DOS 主义,至少我没有听说过名为 的实用程序exists

也在这里:

for file in `ls *.ZIP`

是无用的使用ls。所发生的情况是,shell 扩展了文件名模式*.ZIP,将结果传递给ls...,只是打印出相同的名称。除了您遇到结果分词问题之外。

使用以下命令代替这两个:

shopt -s nullglob
for file in ./*.ZIP; do
    ...
done

首先,shell 非常能够列出匹配的文件名(这就是您上面使用 所做的exists *.ZIP)。然后,nullglob如果没有匹配的文件,Bash会使模式扩展为空。否则,您可能会收到有关字面上称为*.ZIP“不存在”的文件的错误。在模式前加上前缀./可以消除以破折号开头的文件名的一些潜在问题。

此外,您一直使用不带引号的扩展$file,即rm -f $file,而不是rm -f "$file"。这也会导致分词问题,请参阅:

还,

if [ -f "*basic.xml" ]

这是行不通的,因为引号会阻止模式扩展到实际的文件名。它会寻找一个字面上称为*basic.xml.如果您确定只能进行一场比赛,那么就if [ -f *basic.xml ]可以。如果有更多,就会产生错误,因为测试会得到太多参数。

BASIC.XML另外,除非是现有目录,否则这可能会出错。

mv *_BASIC.XML BASIC.XML

好的,我认为建议将脚本分成较小的部分,并单独测试它们(可能撒上一些调试输出),这将是一个好主意。

相关内容