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...에 전달하고 동일한 이름을 인쇄하는 일이 발생합니다. 결과 분할에 문제가 있다는 점만 빼면요.

이 두 명령 대신 다음 명령을 사용하십시오.

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. 일치하는 항목이 하나만 있을 수 있다고 확신한다면 괜찮습니다 if [ -f *basic.xml ]. 그 이상 있으면 테스트에서 너무 많은 매개변수를 가져오게 되므로 오류가 발생합니다.

BASIC.XML또한 기존 디렉토리가 아닌 이상 잘못될 수 있습니다.

mv *_BASIC.XML BASIC.XML

좋습니다. 스크립트를 더 작은 부분으로 나누고 개별적으로 테스트하는 것이 좋습니다(일부 디버그 출력을 뿌릴 수도 있음).

관련 정보