0

我正在尝试将结果附加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.baseline,is.A.4.baseline和之类的文件is.A.8.baseline,因此我希望分别附加“线程数:2”、“线程数:4”和“线程数:8”...

4

2 回答 2

1

您的问题是缺少换行符(或者,在极端情况下,分号)。你的脚本是:

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
于 2013-11-03T17:16:56.837 回答
1

在单独的语句中进行变量赋值和回显:

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

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

于 2013-11-03T17:17:10.117 回答