bash シェルスクリプトエラー: 予期しない表示 '$'do\r' の近くに構文エラーがあります。

bash シェルスクリプトエラー: 予期しない表示 '$'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。シェルがファイル名パターンを拡張し、*.ZIP結果をls...に渡し、同じ名前を印刷することが発生します。結果分割に問題があるという点だけを除けば。

これら 2 つのコマンドの代わりに次のコマンドを使用します。

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

まず、シェルは、一致するファイル名を一覧表示する機能が非常に優れています(上記で行った作業exists *.ZIP)。 Bashは、nullglob一致するファイルがないとパターンが何も拡張されないようにします。そうしないと、*.ZIP文字通り「存在しない」ファイルにエラーが発生する可能性があります。パターンプレフィックスを使用すると、./ダッシュで始まるファイル名に関連するいくつかの潜在的な問題が排除されます。

また、引用符なしで拡張機能を使用しています$file。つまり、rm -f $file代わりにrm -f "$file"。これにより、単語分割の問題が発生する可能性があります。以下を参照してください。

返品、

if [ -f "*basic.xml" ]

引用符はパターンが実際のファイル名に拡張されるのを防ぐため、これは機能しません。文字通りという項目を探します*basic.xml。一致するものが1つしかないと確信していれば大丈夫ですif [ -f *basic.xml ]。それ以上の場合、テストではパラメータが多すぎるため、エラーが発生します。

BASIC.XMLまた、既存のディレクトリでない限り間違っている可能性があります。

mv *_BASIC.XML BASIC.XML

いいですね。スクリプトを小さな部分に分割して個別にテストすることをお勧めします(いくつかのデバッグ出力をスプレーすることもできます)。

おすすめ記事