![将完整组件从一个文件夹复制到另一个文件夹,引发错误的替换](https://linux22.com/image/10983/%E5%B0%86%E5%AE%8C%E6%95%B4%E7%BB%84%E4%BB%B6%E4%BB%8E%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E5%A4%8D%E5%88%B6%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%8C%E5%BC%95%E5%8F%91%E9%94%99%E8%AF%AF%E7%9A%84%E6%9B%BF%E6%8D%A2.png)
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}"
会输出bxr
.在 中
${\$CFILE//\$CFILE/"src/aura/"($(...))}
,\$CFILE
不是有效参数,因此您会收到错误。如果您想对 的内容运行替换CFILE
,您可以使用${CFILE/...}
.
请注意,在“模式”部分中,反斜杠转义了美元符号,因此\$CFILE
将查找文字字符串$CFILE
。话又说回来, using${CFILE/$CFILE/...}
会将 的内容CFILE
既作为要进行替换的文本,又作为要用作模式的文本。它将替换变量(*)的全部内容。这与完全不带参数地写出替换部分是一样的,所以我不太确定你在这里做什么。
(* 当然,除非它是一个与自身不匹配的 glob。)