从 tcsh 执行的 bash 脚本中的语法错误

从 tcsh 执行的 bash 脚本中的语法错误

我编写了下面的行,以验证数字列表的第一个或第二个字段是否等于 146。

我想运行来自 的行tcsh,其中一行由 解释bash

这里有什么问题?

echo $numbers
146 146 0 16 16 10 42 12 10 32 32 3 2 32 26
tcsh

bash -c 'for i in 1 2; do if [ 146 = `echo $numbers | cut -f$i  -d' ' ` ]; then echo "NUM is OK "; fi done'

错误:

` ]; then echo "NUM is OK "; fi done: -c: line 0: unexpected EOF while looking for matching ``'
` ]; then echo "NUM is OK "; fi done: -c: line 1: syntax error: unexpected end of file

答案1

您的“脚本”有几个问题,主要的问题是'需要某种形式的转义。在硬引用字符串内的反引号内,这会变得很麻烦。

您可以通过使用$()而不是反引号来完全避免这种情况,并且不使用硬引号作为分隔符:

... if [ 146 -eq $(echo $numbers | cut -f$i -d\ ) ]; then ...

请注意,这-eq是数字的适当谓词,$numbers需要导出它才能正常工作。

编写一个适当的脚本并从中调用它tcsh是最好的。

答案2

问题在于单引号(用于包装整组命令)。单引号和双引号之间的区别在于,在双引号中,变量和反引号命令将替换为其值,但在单引号中,字符串将按原样处理。

您可以使用:

bash -c "for i in 1 2; do if [ 146 = `echo $numbers | cut -f$i -d' ' ` ]; then echo 'NUM is OK '; fi done"

答案3

怎么样grep?这是一个静态问题,还是数字和标准会改变?

如果是静态的:

echo $numbers | grep -c '(^146\s)|(^\d+\s146\s)'

这将返回 0 或 1,具体取决于是否存在匹配。

这尚未经过测试,但它应该匹配第一个或第二个字段。还有其他模式可能更有效,但应该接近工作。

相关内容