Linux shell脚本没有给出任何输出

时间:2013-08-11 09:08:38

标签: bash shell

我写了以下脚本。它没有给出任何错误。

但它也没有创建任何输出文件

for i in cat list
do
    a=awk '{if ($1 == "H") print $0;}' $i
    b=awk '{if ($1 == "D") print $0;}' $i
    c=$(wc -l < $i)
    d=expr $c - 1`
    e=sed -n '$c'p` 
    f=sed -n '$d'p`
    printf "$a $b $e $f\n" >> output.txt
done

2 个答案:

答案 0 :(得分:1)

你的命令:

for i in cat list; do echo $i; done

只打印catlist作为输出。

如果您只想为每行文件list运行循环,请使用:

while read l
do
   echo "$i"
   # repalce echo with your actual script commands and keep "$i" in double quotes
done < list

答案 1 :(得分:0)

假设你真的需要反击,并考虑Anubhava的修正,剩下的主要问题是sed不会将$c视为shell变量的值 - 你需要加倍在此上下文中引用,以使shell在sed看到它之前扩展变量的值。

while read -r i; do
  a=$(awk '{if ($1 == "H") print $0;}' "$i")
  b=$(awk '{if ($1 == "D") print $0;}' "$i")
  c=$(wc -l < "$i")
  d=$(expr "$c" - 1)
  e=$(sed -n "${c}p")
  f=$(sed -n "${d}p")
  printf "$a $b $e $f\n"
done <file >>output.txt

还要注意在变量名称周围明智地使用双引号,以及重构输出重定向。如果您要覆盖output.txt而不是附加,请使用单个>

这仍然不是一个漂亮的脚本,但如果不了解实际问题和所需的输入和输出,很难说如何改进它。根据它的一般外观,完全用Awk重写它可能是一个好主意。