在shell if命令中将数字与变量进行比较
我有一个存储为的变量在shell if命令中将数字与变量进行比较,shell,if-statement,comparison,Shell,If Statement,Comparison,我有一个存储为的变量 upstream_introngap=$(awk '$3==$start-1 && $4 ~/$geneid/' File | awk '{print $3-$2}') 并在代码中使用它作为 if [ "$upstream_introngap" -lt "100" ] ; then condition 然而,我得到了一个错误 [: : integer expression expected 我正在尝试不同的组合,但我无法获得正确的比较表达式,
upstream_introngap=$(awk '$3==$start-1 && $4 ~/$geneid/' File | awk '{print $3-$2}')
并在代码中使用它作为
if [ "$upstream_introngap" -lt "100" ] ; then
condition
然而,我得到了一个错误
[: : integer expression expected
我正在尝试不同的组合,但我无法获得正确的比较表达式,这里的问题是要比较的变量还是表达式/数字?
比如说
grep -w ENSG00000007237:I2 File
chr17 9964697 10017758 ENSG00000007237:I2 -
awk '$3==10017758 && $4 ~ /ENSG00000007237/' File | awk '{print $3-$2}' for
53061
上一行
我想比较一下这个数字(53061),看看它是否小于100
start=10017759
geneid=ENSG00000007237
upstream_introngap=$(awk -v s="$start" -v id="$geneid" '$3==s-1 && $4~id {print $3-$2; exit}' File)
if [ "$upstream_introngap" -lt "100" ]; then
echo less than
else
echo greater or equal
fi
将此作为示例文件:
$ cat File
chr17 9964697 10017758 ENSG00000007237:I2 -
该脚本生成以下输出:
$ bash script
greater or equal
注:
start
和geneid
是shell变量。选项-vs=“$start”
和-v id=“$geneid”
将这些shell变量分配给awk变量id
匹配,则表达式$4~id
为真。在此上下文中,id
被视为正则表达式。如果id
包含任何正则表达式活动字符,例如()*+[]
,则结果可能不是您期望的结果在运行此代码之前,请使用
set-x
,查看它运行的实际比较结果。很可能变量的值不是您所想的。显示您的示例输入并澄清您试图执行的操作,因为可能有更好的方法。@CharlesDuffy awk代码包含$start
和$geneid
,但在awk代码中既没有定义start
也没有定义geneid
。这可能意味着OP希望shell能够替代这些变量,但不会,因为awk代码是单引号。不管他期望awk代码做什么,我觉得它不太可能做到。啊——是的,这是可靠的推理。可能是类似于awk-v start=“$start”-v geneid=“$geneid””$3==(start-1)和&$4~geneid{print$3-$2}'
,或类似的东西。@AishwaryaKulkarni,您的第一行代码在单引号中使用了$start
和$geneid
,因此,在awk
启动之前,它们实际上不会被shell替换为实际值。因此,即使start=10017759
和geneid=ensg0000007237
,您也不会在awk'$3==start-1&&$4~/$geneid/'
和awk'$3==10017758&$4~/ensg0000007237/'之间获得相同的行为。这就是我对上述awk代码提出的修改的目的。