首页 > 解决方案 > shell 脚本中需要一元运算符

问题描述

我不确定为什么下面的代码会生成此错误(standard_in) 1: syntax error -bash: [: -eq: unary operator expected 。有人可以帮我解决这里的问题吗?谢谢!

#!/bin/bash    
BAMLINES=4.47264e+09
FQ1LINES=4000000
FQ2LINES=4000000
DEBUG=1

if [ ! -z ${DEBUG} ]; then
echo "${BAMLINES} lines in .bam"
echo "${FQ1LINES} lines in all ${FQ_OUT1} files"
echo "${FQ2LINES} lines in all ${FQ_OUT2} files"

if [ $(echo "scale=2;${FQ1LINES}/${BAMLINES} > 0.40" | bc) -eq 0 ]; then
    echo "Warning, FQ1 file contains ${FQ1LINES} lines - less than 40% of the number of reads of .bam file"
  fi
if [ $(echo "scale=2;${FQ2LINES}/${BAMLINES} > 0.4" | bc) -eq 0 ]; then
    echo "Warning, FQ2 file contains ${FQ2LINES} lines - less than 40% of the number of reads of .bam file"
  fi  
fi

标签: bashvisual-studioshell

解决方案


$ echo "scale=2;($FQ1LINES/$BAMLINES) > 0.40"
scale=2;(4000000/) > 0.40
# ..............^^

您想使用其中一个BAMLINE或两个,BAMLINES但不能同时使用。


$ echo "scale=2;($FQ1LINES/$BAMLINES) > 0.40" | bc
(standard_in) 1: parse error

由于该错误, 的输出$(echo ... | bc)为空,然后[仅获得 2 个参数。当[获得 2 个参数时,第一个运算符应为一元运算符(如-zis)——-eq不是一元运算符。


您需要在[...]. 在这种情况下,您会得到一个不同但更有意义的错误:

$ [ "$(echo "scale=2;${FQ1LINES}/${BAMLINES} > 0.40" | bc)" -eq 0 ]
(standard_in) 1: parse error
bash: [: : integer expression expected

或者使用[[...]],你只会看到 bc 错误

$ [[ $(echo "scale=2;${FQ1LINES}/${BAMLINES} > 0.40" | bc) -eq 0 ]]
(standard_in) 1: parse error

推荐阅读