Если то оператор bash не работает с командами qiime

Я только начал ругаться, и я застрял на некоторое время в простом утверждении if;then. Я использую bash для запуска команд QIIME, написанных на python. Эти команды позволяют мне иметь дело с микробной ДНК. Из необработанного набора данных из последовательности я должен сначала проверить, соответствуют ли они формату, с которым может работать QIIME, прежде чем я смогу перейти к остальным командам.

module load QIIME/1.9.1-foss-2016a-Python-2.7.11
echo 'checking mapping file and demultiplexing'
validate_mapping_file.py -m $PWD/map.tsv -o $PWD/mapcheck > tmp.txt
n_words=`wc -w tmp.txt`
echo "n_words:"$n_words
if [ n_words = '9 temp.txt' ];then
split_libraries_fastq.py -i $PWD/forward_reads.fastq.gz -b $PWD/barcodes.fastq.gz -m $PWD/map.tsv -o $PWD/demultiplexed
else
  echo 'Error(s) in map'
  exit 1
fi

Если карта хорошая, я ожидаю следующий результат (9 слов):

No errors or warnings were found in mapping file. 

Если это плохо (16 слов):

Errors and/or warnings detected in mapping file.  Please check the log and html file for details.

Я хочу использовать этот вывод для обработки следующих команд split_libraries_fastq.py.

Я перепробовал много разных версий заявления if;then, попросил помочь, но ничего не помогло. Кто-нибудь из вас имел представление о том, почему команда "then" не выполняется? Также я запускаю его через кластер.

Вот вывод, когда моя карта хороша, вторая команда не выполняется:

checking mapping file and demultiplexing
n_words:9 tmp.txt
Error(s) in map

Спасибо

2 ответа

Решение

Просмотрите синтаксис оболочки, в частности двойные кавычки и расширение параметров. Вам нужен доллар, чтобы расширить n_words и двойные кавычки, чтобы сделать его единой строкой, несмотря на встроенное пространство. Например:

if [ "$n_words" = '9 temp.txt' ]; then
    echo "good"
else
    echo "bad"
fi

В качестве альтернативы рассмотрите возможность пропустить имя файла и выполнить целочисленное сравнение:

n_words=`wc -w < tmp.txt`
echo "n_words: $n_words"
if [ "$n_words" -eq 9 ]; then
#...

Наконец, позвольте мне предупредить вас, что подсчет количества слов - плохой взлом, так как невинные изменения в скрипте Python могут сломать ваш скрипт оболочки. Я не знаком с Qiime, но они должны предоставить значимый статус выхода. Пытаться:

validate_mapping_file.py -m $PWD/map.tsv -o $PWD/mapcheck > /dev/null
exit_status=$?
echo "exit status: $exit_status"

Я думаю, что код может быть улучшен. Что не так в вашем коде, так это в основном оператор доллара, используемый для вызова переменных после их установки.

Вы считаете строки внутри файла temp.txt. Лучшая версия будет:

n_words=$(wc -l temp.txt)
if [ "$n_words" -eq 9 ]; then
  echo "${n_words} equal to 9"
else
  echo "${n_words} is not equal to 9"
fi
Другие вопросы по тегам