#bash #visual-studio #shell
#bash #visual-studio #оболочка
Вопрос:
Я не уверен, почему мой приведенный ниже код генерирует эту ошибку (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
Комментарии:
1. Используйте
[[ ... ]]
вместо[ ... ]
2. @anubhava Теперь это дает
(standard_in) 1: syntax error
3. Вы уверены, что используете
bash
?4. @anubhava Да, это так.
Ответ №1:
$ 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