我需要将文件从一个文件夹复制到另一个文件夹,这里的源和目标信息位于文本文件中。
文件内容:res.txt
/var/lib/jenkins/jobs/Android\ Gradle\ 测试\ 构建/工作区/MainApp/app/src/main/res/drawable-hdpi/logo_splash.png=/var/lib/jenkins/jobs/Android\ Gradle\ 测试\ 构建/工作区/MainApp/app/src/main/res/drawable/logo_splash.png
这里我尝试用分隔符“=”分割字符串并将其分配给相应的变量。并且,需要触发复制命令。
为了实现上述目标,我尝试将字符串拆分为一个数组,并将数组索引元素值分配给局部变量
lines=/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable-hdpi/logo_splash.png=/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable/logo_splash.png
SOURCE=""
DEST=""
echo $lines | awk '{split($0,numbers,"=")} END {
for(n in numbers){
if (n == 1) {
SOURCE = ${numbers[1]}
}
else if (n == 2) {
DEST= ${numbers[2]}
}
}}'
echo ${numbers[1]}
echo ${numbers[2]}
出现错误
awk: {split($0,numbers,"=")} END {for(n in numbers){ SOURCE = ${numbers[1]}}
awk: ^ syntax error
并获取 echo 输出为
+ echo
+ echo
@Gombai Sandor,我按照你的建议更改了上述内容,并且有效。
SOURCE=$(echo $lines | awk -F= '{print $1}')
echo "source is " $SOURCE
DESTINATION=$(echo $lines | awk -F= '{print $2}')
echo "destination is " $DESTINATION
答案1
您正在将 shell 的if [...] ... elif [...] ... fi
语法混合到 awk 的代码中。awk 将使用
if (...) {
...
} else if (...) {
...
}
在此背景下。
此外,您期望 awk 的数组出现在 awk 的父 shell 中
echo ${numbers[1]}
echo ${numbers[2]}
这不会发生。您可以在 awk 中编写字符串,然后在 shell 中解析该输出,这样 awk(或任何其他程序)就不会破坏其调用环境。
指出语法错误的地方是另一种混合:
${numbers[1]}
是 bash 数组元素引用...在 awk 代码中(它对 awk 几乎有一定意义,但我建议不要强制这样做)。
我建议描述你的任务到底是什么,并寻求提示,因为你希望如何在这里解决它,并解释为什么它不起作用会有点长。但首先你应该消化一下,shell(及其语言)是一回事,而 awk(及其语言)在它里面运行是另一回事。它们有相似的元素,但那只是相似之处。
如果字符串通过单个字符连接,则将其拆分为两部分非常容易,并且不需要 awk。cut 是基本的拆分程序。
SOURCE=$(echo $lines | cut -f1 -d=)
将把第一个字段放入 SOURCE 中,其中字段在输入中用 = 分隔切 有时,你可能会遇到这样的代码,
SOURCE=$(echo $lines | awk -F= '{print $1}')
是一样的。可以用两种方法类似地分配 DEST,但针对的是第二个字段。