表达式中的语法错误

时间:2017-11-09 17:56:46

标签: bash

它在第5行和第11行中的表达式中写入语法错误(错误标记为" tmp"),这两者都是"对于"如果你能帮忙的话,我的tmp文件是在2行之前创建的,并且甚至不会出现在这些行中 感谢

   load 'stats'
   normalrand 5
_0.514477 1.23645 _0.353373 _0.522193 1.23505

1 个答案:

答案 0 :(得分:1)

让我们仔细看看这里发生了什么:

local courseToSearch=$1
grep $1 courses.list > tmp
local linesNumber=$(wc -l tmp | cut -f1)
for((i = 0; i<$linesNumber; i++)); do
local arrToSearchIn=$(grep $courseToSearch courses.list | head -n+1 |  tail -1)

第5行for((i = 0; i<$linesNumber; i++)); do报告错误, 消息是这样的:

script.sh: line 5: ((: i<       6 tmp: syntax error in expression (error token i

那里的i< 6 tmp是什么? 它看起来很熟悉吗? 它来自代码中的条件i<$linesNumber$linesNumber的价值非常可疑。 如果您在echo $linesNumber循环之前添加for, 你会看到这样的东西:

      6 tmp

数字6取决于示例输入,但这个细节并不重要。 重要的是$linesNumber的值不是数字。

通过改进负责此值的行,可以很容易地解决这个问题。让我们一步一步地讨论这篇文章:

local courseToSearch=$1
grep $1 courses.list > tmp
local linesNumber=$(wc -l tmp | cut -f1)

您将$1的值分配给具有描述性名称courseToSearch的变量非常好。 但那你为什么不在grep

中使用它呢?

其次,grep $1 courses.list不安全, 因为如果函数参数包含不安全的字符,它将会中断。 你可以通过双引号来解决这个问题。

接下来,您真的需要一个临时文件tmp吗? 并不是的。 事实上,这部分是你问题的主要来源之一。 问题是tmp包含数字和文件名, 并且cut -f1无效删除它。 如果您不使用临时文件, 但直接输出grep的输出, 没有输出文件可以担心。

将上述提示放在一起:

local courseToSearch=$1
local linesNumber=$(grep "$courseToSearch" courses.list | wc -l)

这将解决循环问题。

但是,让我们走得更远。 这里发生了什么:

local arrToSearchIn=$(grep $courseToSearch courses.list | head -n+1 |  tail -1)

特别是head -n+1 | tail -1是什么? 拿输入的第一行, 然后采取最后一行? 当只有一行时,tail没有意义。 写得像这样:

local arrToSearchIn=$(grep "$courseToSearch" courses.list | head -n 1)

其余的代码可能还有很多问题。

遵循我上面解释的相同逻辑。 找到每一位代码的目的。 每一位都必须有目的,你必须明白这个目的。 如果你不理解某事, 在文档中找到它。 如果你还是不明白, 然后删除它,并观察它有什么不同。 将脚本修剪为最简单的形式, 这样你就可以理解。 必要时删除功能。 逐渐添加功能, 观察每一步所产生的差异,并从中学习。 祝你好运!