我编写了下面的行,以验证数字列表的第一个或第二个字段是否等于 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,具体取决于是否存在匹配。
这尚未经过测试,但它应该匹配第一个或第二个字段。还有其他模式可能更有效,但应该接近工作。