将输出存储到变量bash中

时间:2013-11-03 17:09:18

标签: linux bash gawk

我正在尝试将gawk的结果附加到相应的文件中,并使用for循环到目录基线中的所有文件:

#! /bin/sh

for file in baselines/*; do numThreads=$(echo $file | gawk 'BEGIN { FS = "." } ; {print $3 }') echo "Number of Threads: $numThreads" >> $file; done

numThreads变量未分配给任何内容,因此它将“线程数:”附加到文件中。

文件夹基线包含is.A.2.baselineis.A.4.baselineis.A.8.baseline等文件,所以我希望附加“线程数:2”,“线程数:4”和“线程数:8”分别......

2 个答案:

答案 0 :(得分:1)

你的问题是缺少换行符(或者,在extremis中,分号)。你的脚本是:

for file in baselines/*; do numThreads=$(echo $file | gawk 'BEGIN { FS = "." } ; {print $3 }') echo "Number of Threads: $numThreads" >> $file; done

echo "Number of Threads..."部分之前,您需要换行符或分号。像这样可读性:

for file in baselines/*
do
    numThreads=$(echo $file | gawk 'BEGIN { FS = "." } ; {print $3 }')
    echo "Number of Threads: $numThreads" >> $file
done

如果你坚持编写不可读的代码,就像这样:

for file in baselines/*; do numThreads=$(echo $file | gawk 'BEGIN { FS = "." } ; {print $3 }'); echo "Number of Threads: $numThreads" >> $file; done

但是请不要再将这样的代码发送到Stack Overflow进行审核/修订,因为它很难阅读,人们也不会费心去回答难以阅读代码的问题。

顺便说一句,你的代码所做的是非常巧妙的错误。它运行echo命令,环境变量numThreads设置为正确的值,但是参数列表的扩展在此之前发生,因此numThreads为空因为评估了"Number of Threads: $numThreads"字符串。证明这一点的一种方法是:

for file in baselines/*
do
    numThreads=$(echo $file | gawk 'BEGIN { FS = "." } ; {print $3 }') env | grep numThreads
done

将打印环境变量的值。证明它的另一种方式是:

for file in baselines/*
do
    numThreads=$(echo $file | gawk 'BEGIN { FS = "." } ; {print $3 }') sh -c 'echo numThreads=$numThreads'
done

答案 1 :(得分:1)

在单独的语句中执行变量赋值和echo:

for file in baselines/*; do
    numThreads=$(echo $file | gawk 'BEGIN { FS = "." } ; {print $3 }')
    echo "Number of Threads: $numThreads" >> $file
done

变量扩展在执行任何操作之前发生,因此当您将它们放在一行上时,变量会在分配之前展开。只有当您临时设置将在子进程中访问的环境变量时,才应使用该语法,而不是在为当前进程设置shell变量时使用。