bash - 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
解决方案
$ 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 个参数时,第一个运算符应为一元运算符(如-z
is)——-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
推荐阅读
- memory - GCP Bitnami Lamp Stack CPU 与内存
- java - 检查布尔数组中所有值的快速方法
- javascript - POST 请求后触发刷新(AJAX 或 XMLHttpRequest)
- javascript - 带有多个标记的 Google Maps javascript => 标签文本在循环中到处都是相同的
- javascript - 如何通过浏览器自动填充属性自动填充表单而无需任何点击?
- devexpress - 在 DevExpress DateEditFor 控件上,如何仅通过单击日历来强制选择日期而不是手动输入
- java - 为什么java编译器在获取之前不检查列表参数中的对象类型?
- c# - 如何在 .net 中正确同步桌面和移动应用程序?
- python - 从pdf中提取数据的最佳方法是什么
- angular - 从firebase数据库读取数据角度8