Bash: 非法变量名错误

3
我正在尝试使用grep从文本文件中提取一个字段。我想将行号存储到bash变量中以便以后使用,但是我遇到了非法变量名错误。这是我的脚本的一部分:
#!/bin/csh

set echo

grep -n -m 1 "HR${4}" Tossed/length${1}/TL${1}D2R${2}-${3}TT.txt | cut -d : -f 1

To_Start=$((grep -n -m 1 "HR${4}" Tossed/length${1}/TL${1}D2R${2}-${3}TT.txt | cut -d : -f 1))

这是输出结果:
[maurerj1@rucc-headnode Tenengolts_Generate]$ ./flow_LBBH.sh 7 0 0 0
grep --color=auto -n -m 1 HR0 Tossed/length7/TL7D2R0-0TT.txt
cut -d : -f 1
1                          #This is the right number
Illegal variable name.     #why is this not working?

根据我所了解的,bash变量名允许使用大写字母、小写字母和下划线,那么我做错了什么呢?


一个问题是:set echo将清除您传递给脚本的任何参数,并将$1设置为字符串echo。这行代码的意图并不明显。 - chepner
1
你的问题被标记为 [tag:bash],而且标题中包含“Bash”一词,但是你的脚本似乎在使用 csh。至少,这是 shebang 行调用的内容。请澄清并修正标签/标题或 shebang,使它们保持一致。 - rici
2个回答

4

我通过从csh更改为bash,删除set echo(因为它使所有输入变量变成“echo”而引起了一些奇怪的问题),并从$(())更改为$()来解决了这个问题。


2

$(( expr )) 语法用于计算,因此出现了令人困惑的消息。

例如:echo $((4+4)) 输出 8

如果你想评估命令的结果,只需使用简单的括号:

To_Start=$(grep -n -m 1 "HR${4}" Tossed/length${1}/TL${1}D2R${2}-${3}TT.txt | cut -d : -f 1)

一个简单的复现程序来证明我的观点:

To_Start=$(echo a:b | cut -d : -f 1)
echo $To_Start

产生:

a

对你有效吗?(当然,使用不同的字符串和文件)我仍然无法让它工作 :( - Jeff
以一种方式:$ To_Start=$(grep -n -m 1 "HR${4}" Tossed/length${1}/TL${1}D2R${2}-${3}TT.txt | cut -d : -f 1) grep: Tossed/length/TLD2R-TT.txt: 没有这样的文件或目录。 我添加了一个独立的示例来证明我的观点。 - Jean-François Fabre
它可以工作。当我在命令行上输入时,一切都正常,但当我在脚本中使用它时,它就无法工作了……这是什么意思?非常感谢你迄今为止的帮助。 - Jeff
@Jeff:它不起作用是指您仍然收到非法变量名吗?如果是这样,请发布您已更正的脚本,否则无法讨论此问题。 - user1934428
@Jeff接下来肯定是下一个问题。没有人说你只有一个问题 :) - Jean-François Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接