Ожидаемый унарный оператор в сценарии оболочки

#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