【问题标题】:tsch syntax error:unecxpected end of file when using while loop to read linestcsh 语法错误:使用 while 循环读取行时文件意外结束
【发布时间】:2014-07-04 08:35:13
【问题描述】:

我们一直在尝试让脚本在 tcsh 中工作(我知道大多数地方都说不应该使用它,但我认为我别无选择)。

脚本应该接受一个包含列的文件并删除相同的行,但添加其中的行数。我们是 tsch 的新手,在语法正确时遇到了麻烦。对于不同的 shell,似乎存在所有相似但仍然不同的语法,这更加令人困惑。

似乎有些东西没有按应有的方式关闭,但我们尝试了 fi、endif、done 和 end for if 和 while 循环的任何组合。删除 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 

【问题讨论】:

    标签: shell csh tcsh


    【解决方案1】:

    首先,您发布的代码有另一个错误:如果您尝试运行它,错误消息将是“无效的空命令。”。始终发布您使用的确切代码(它也应该以shebang 行开头)。然后复制粘贴错误消息——在您应该复制粘贴的内容中出现拼写错误(“unecexpected”)是不可原谅的。

    如果您真的想使用 tcsh(而且您可能不需要 — 一个 Bourne/POSIX 风格的 shell 随处可用 tcsh,而且通常您甚至有 ksh 或 bash),您需要使用 tcsh 功能,而不是 sh 特征。与其盲目尝试,不如阅读手册。它不会解决你所有的问题,但它确实解释了如何编写 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。没有 do 或 done 关键字。此外,括号中的内容需要是一个表达式;要使用return status of an instruction as the value of an expression,请将指令放在大括号中。

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

    foreach line ("`cat`")
      …
    end
    

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

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

    我建议改为在 sh 中编写此脚本,因为您似乎更熟悉它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-07
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 2017-06-08
      • 2013-04-13
      相关资源
      最近更新 更多