tcsh语法错误:使用while循环读取行时意外结束文件

时间:2014-07-04 08:35:14

标签: shell csh tcsh

我们一直在努力让脚本在tcsh中运行(我知道大多数地方都说不应该使用它,但我认为我没有选择)。

脚本应该接收带有列的文件并删除相同的行,但添加其中有多少行。我们是tsch的新手,并且无法正确使用语法。对于不同的shell,似乎存在所有相似但仍然不同的语法,这是令人困惑的。

似乎某些东西没有被关闭,但我们已经尝试过if和while循环的任何类型的fi,endif,done和end的组合。删除if情况并不能解决问题,也不会删除while循环之外的内容。问题可能是我们如何使用阅读?

awk '{print $1,$3}' raw_data|
awk -v OFS=' -> ' '{$1=$1};1'| sort -k 3 > collapsed_output.txt

number=0
lastline=0
while ( read -r collapsed_output.txt )
    do 
    line = $line
    if ( line == lastline )
        then
        number=number+1
    else if( number != 0 ) 
        then sed -i 'ls/^/lastline + ["label =" number] \n/' numbered_data.txt
        number=1
        lastline = line
    else
        number = 1
        lastline = line
    fi
done
sed -i 'ls/^/lastline + ["label =" number] \n/' numbered_data.txt
sed -i '1s/^/digraph finite_state_machine {\n/' numbered_data.txt
sed -i '$ a\'"}" numbered_data.txt 

1 个答案:

答案 0 :(得分:0)

首先,您发布的代码有另一个错误:如果您尝试运行它,则错误消息将是“无效的空命令”。始终发布您使用的确切代码(它应该以shebang行开头)。并且复制粘贴错误信息 - 你应该复制粘贴的东西中的拼写错误(“不可预见的”)是不可原谅的。

如果你真的想使用tcsh(并且你可能不需要 - 一个Bourne / POSIX风格的shell在tcsh到处都可用,通常你甚至有ksh或bash),你需要使用tcsh功能,而不是功能。不要盲目地尝试,而是阅读手册。它不会解决您的所有问题,但它确实解释了如何编写while循环。

tcsh中也存在sh的一个特性是-x选项,用于在执行时打印一行线。这至少会揭示错误的位置 - 它就在成功解析并执行的行之后。

“无效的空命令。”是由第一个代码行引起的:你不能在管道之后放一个换行符(与sh不同)。你需要一个反斜杠表示行继续,或者把所有内容放在同一行。

你不能在csh中放置一个简单的赋值 - number=0尝试调用一个名为number=0的命令,line = $line尝试调用一个名为line的命令(一个也是sh的情况!)。分配可以写为@ VARIABLE = EXPRESSION代表数字,set VARIABLE="VALUE"代表字符串。

while loop的语法是while (EXPRESSION) INSTRUCTIONS… wend。没有dodone关键字。此外,括号中的内容需要是一个表达式;要使用return status of an instruction as the value of an expression,请将指令放在大括号中。

read是一个Bourne命令,在tcsh中不存在。您可以通过阅读$< variable获得相同的功能,但据我所知,您无法检测到文件的结尾(它与空行无法区分),这使得无法读取文件中的文件。环。从标准输入读取行的另一个选项是

foreach line ("`cat`")
  …
end

但请注意,这会跳过空行并修改反斜杠。

你的循环中有一些奇怪的逻辑 - 我不明白它正在尝试做什么,而无效的sed命令(你的意思是1s而不是ls?)没有帮助。

我建议用sh编写这个脚本,因为你似乎更熟悉它。