【问题标题】:Using variables from for loop after loop has closed循环关闭后使用 for 循环中的变量
【发布时间】:2015-07-18 06:14:57
【问题描述】:

我已删除旧问题,希望这个简化且更精确的版本能够奏效。

我有一个文件:

#Works Command
cd /tmp
mkdir folder
echo "it worked" >file
cat file

#Not working Command
cd /tmp
mkdir file
echo "it didn't work" >wrong
cat wrong

命令组少至 1 组,多至 20 组,但每组命令都以“Command”结尾的注释作为前缀

我希望完成的是将每个注释设置为一个变量,当调用该变量时将执行命令。

回显 $var1 时的期望结果

cd /tmp
mkdir folder
echo "it worked" >file
cat file

我尝试过使用:

while read -r line; do var+=("$line"); done < <(awk '/Command/,/Command/' file)

将 cmets 设置为变量,但我还没有找到用于命令分组的可行解决方案。

我尝试过使用:

for i in {1..5}
do
awk '/'"${var[$i]}"'/,/'"${var[$i+1]}"'/' file |egrep -vi "${var[$i]}|${var[$i+1]}"
done

希望这将有助于澄清事情。我很抱歉发布了一个没有明确需要做什么的问题。

【问题讨论】:

  • 代码与输出不匹配!
  • 如果i指向最后一个块,$var[$i+1] 为空。!
  • 您说(如果我理解正确的话)${var[2]} 扩展为 cat bunny fish,但您的示例输入中根本没有出现 bunny 这个词。如果没有实际可行的示例,我们将很难确定您要做什么。考虑修改您的示例输入和输出,以便它们实际上是一致的......
  • 当我在 shell 中看到一个关于“导出变量”的问题时,我希望它是关于范围和环境管理的。据我所知,这与主题完全无关。也许最好尝试找到一个避免使用艺术术语而不是其技术含义的标题?
  • ...如果您真正的根本问题是 FAQ #24,那么这与之前在此站点上多次询问和回答的问题非常相似——但措辞却让人难以辨认。

标签: bash for-loop awk while-loop


【解决方案1】:

您更新后的问题听起来像是您需要非常小心的问题,但是在这里(我更改了示例输入,因为我不想在/tmp 中创建文件!):

$ cat file
#First Command
echo 'here is the date'
date +'%D'

#Second Command
echo 'here is the time'
date +'%T'              

$ IFS=$'\n' var=( $(awk -v RS= -v FS='\n' -v OFS=';' '{for (i=2;i<=NF;i++) printf "%s%s", $i, (i<NF?OFS:ORS)}' file) )

$ echo "${var[0]}"
echo 'here is the date';date +'%D'

$ echo "${var[1]}"
echo 'here is the time';date +'%T'

$ eval "${var[0]}"          
here is the date
05/07/15

$ eval "${var[1]}"
here is the time
11:42:51

您可以决定是否eval 或declare 或其他方式是执行命令的正确方式。

【讨论】:

  • 抱歉,我已经对我真正想要做的事情进行了澄清。使用 awk 来划分信息不是问题,而是让每个部分成为可以在以后调用的变量。这样做更有意义吗,我很抱歉!
  • 这些分组是命令列表,我已将其简化为单词,只是为了问题的简单性。对于您的最后一条评论,是的,该文件实际上包含需要执行的命令。
  • 哇,你真棒。感谢您理解我在询问时如此倒退时实际询问的内容。对此,我真的非常感激!谢谢!
  • 不客气。听起来您才刚刚开始学习 shell,所以要非常小心 eval(或 declare),确保您阅读了它并在实施之前做出明智的决定。您还应该查看 shell 函数 - ENV 文件中的某些函数可能是比上述更好的选择。
猜你喜欢
  • 1970-01-01
  • 2014-05-01
  • 2013-08-07
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2013-09-29
相关资源
最近更新 更多