它在第5行和第11行中的表达式中写入语法错误(错误标记为" tmp"),这两者都是"对于"如果你能帮忙的话,我的tmp文件是在2行之前创建的,并且甚至不会出现在这些行中 感谢
load 'stats'
normalrand 5
_0.514477 1.23645 _0.353373 _0.522193 1.23505
答案 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)
其余的代码可能还有很多问题。
遵循我上面解释的相同逻辑。 找到每一位代码的目的。 每一位都必须有目的,你必须明白这个目的。 如果你不理解某事, 在文档中找到它。 如果你还是不明白, 然后删除它,并观察它有什么不同。 将脚本修剪为最简单的形式, 这样你就可以理解。 必要时删除功能。 逐渐添加功能, 观察每一步所产生的差异,并从中学习。 祝你好运!