Shell 将数组元素值保存在变量中

Shell 将数组元素值保存在变量中

我需要将文件从一个文件夹复制到另一个文件夹,这里的源和目标信息位于文本文件中。

文件内容: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,但针对的是第二个字段。

相关内容