한 폴더에서 다른 폴더로 전체 어셈블리를 복사하면 잘못된 대체가 발생함

한 폴더에서 다른 폴더로 전체 어셈블리를 복사하면 잘못된 대체가 발생함

Final.txt는 다음과 같습니다.

build/create_changes.sh
build/create_changes.sh-meta.xml
src/aura/camping/camping.design
src/aura/camping/camping.design-meta.xml

/aura/해당 줄에 포함된 파일 만 바꾸고 싶습니다.src/aura/camping

다음 코드를 작성했지만 오류가 발생합니다.

echo replaceText ${\$CFILE//\$CFILE/"src/aura/"($(basename -- "$(dirname -- "$CFILE")"))}

line 62: ${\$CFILE//\$CFILE/"src/aura/"($(basename -- "$(dirname -- "$CFILE")"))}: bad substitution

이것은 ($(basename -- "$(dirname -- "$CFILE")캠핑을 $CFILE주고 src/aura/camping/camping.design.

src/aura/camping/camping.design하지만 그것은 대체 되지 않습니다src/aura/camping

function contains() {
    local n=$#
    local value=${!n}
    for ((i=1;i < $#;i++)) {
        if [ "${!i}" == "${value}" ]; then
            echo "y"
            return 0
        fi
    }
    echo "n"
    return 1
}

if [ -e final.txt ]
then
        ARRAY=()
        while read CFILE
            do
                    echo Analyzing file `basename $CFILE`
                    case "$CFILE"
                    in
                        *.app) TYPENAME="AuraDefinitionBundle";;
                        *.cmp) TYPENAME="AuraDefinitionBundle";;
                        *.css) TYPENAME="AuraDefinitionBundle";;
                        *.evt) TYPENAME="AuraDefinitionBundle";;
                        *.js) TYPENAME="AuraDefinitionBundle";;
                        *.svg) TYPENAME="AuraDefinitionBundle";;
                        *.auradoc) TYPENAME="AuraDefinitionBundle";;
                        *.design) TYPENAME="AuraDefinitionBundle";;
                        *) TYPENAME="UNKNOWN";;
                    esac

                    if [ "$TYPENAME" == "AuraDefinitionBundle" ]
                        then
                                if [ $(contains "${ARRAY[@]}" $(basename -- "$(dirname -- "$CFILE")")) != "y" ]
                                then
                                    echo baseFile from new method cFile $CFILE
                                    ARRAY+=($(basename -- "$(dirname -- "$CFILE")"))
                                    echo replaceText ${\$CFILE//\$CFILE/"src/aura/"($(basename -- "$(dirname -- "$CFILE")"))}

                                else
                                    continue
                                 fi
                        fi
            done < final.txt
else
echo Change file not found!
fi

마지막으로 실행 cat final.txt | xargs -I {} cp --parents {} $1 되고 모든 파일이 campaign폴더에서 다른 파일 경로로 복사되어야 한다고 생각합니다.

시험을 마친

 echo baseFile from new method cFile $CFILE
 FILENAME = "$CFILE"
 ARRAY+=($(basename -- "$(dirname -- "$CFILE")"))
 replace=$(basename -- "$(dirname -- "$CFILE")")
 echo relaceWord $replace
 echo replaceText ${FILENAME//$CFILE/$replace}

답변1

확장에서는 ${parameter/pattern/replacement}매개변수 이름을 첫 번째 요소로 사용합니다. 따라서 foo=bar; echo "${foo/a/x}"출력 .in bxr은 유효한 인수가 아니므로 오류가 발생합니다. 콘텐츠에 대해 대체를 실행하려면 를 사용할 수 있습니다 .${\$CFILE//\$CFILE/"src/aura/"($(...))}\$CFILECFILE${CFILE/...}

"패턴" 섹션에서 백슬래시가 달러 기호를 이스케이프하므로 \$CFILE리터럴 문자열이 발견됩니다 $CFILE. 그런 다음 다시 using은 ${CFILE/$CFILE/...}내용을 CFILE바꿀 텍스트와 패턴으로 사용할 텍스트로 처리합니다. 변수 (*) 의 전체 내용을 대체합니다 . 이는 매개변수 없이 교체 부품을 작성하는 것과 동일하므로 여기서 무엇을 하는지 잘 모르겠습니다.

(*물론 자체적으로 일치하지 않는 glob이 아닌 한.)

관련 정보