我正在尝试将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”分别......
答案 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变量时使用。