以下のスクリプトを作成しましたが、そのスクリプトがあるディレクトリ(したがってファイル)で実行するとき
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
いいですね。スクリプトを小さな部分に分割して個別にテストすることをお勧めします(いくつかのデバッグ出力をスプレーすることもできます)。