Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在shell if命令中将数字与变量进行比较_Shell_If Statement_Comparison - Fatal编程技术网

在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变量

  • 不需要两个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代码提出的修改的目的。