2015-04-14 3 views
2

Я написал этот сценарий оболочки. Я получил сообщение об ошибке для строк 14 и 18, но я не вижу, что не так. Сценарий должен анализировать каждый файл *.fq. Если первые три символа данного файла не соответствуют «HWI», тогда скрипт просто ответит «invalide format», но если они совпадут, скрипт даст мне количество строк «HWI» в этом файле.Как проверить формат файла

!/bin/sh 
for f in *.fq 
do 
a="$(head -n1 $f)" 
c="$(expr substr $a 2 3)" 
echo $c 
nr="$(grep -w "HWI" $f | wc -l) 
if [ "$c"="HWI" ] ; 
then 
    echo $f | "the number of read of $f is $nr" 
else 
    echo"Invalide Format" 
fi 
done 

Может кто-нибудь объяснить, каковы мои ошибки?

+0

'echo" foo "' является ошибкой, потому что вам нужно пространство между командой и строкой. 'echo $ var | «string» - это ошибка, если «строка» не является командой (и не делает ничего полезного, если только эта команда не считывает данные со стандартного ввода). Добавьте пробел и отпустите '$ f |' из этой другой строки 'echo'. О, также ** сообщите нам ошибки, которые вы получаете **, поэтому нам не нужно гадать. –

+0

Кроме того, исправьте she-bang ('#!/Bin/sh'), и ваш скрипт не имеет 18 строк, поэтому это, вероятно, всего лишь отрывок, но если это так, то цитирование номеров строк бесполезно. .. – twalberg

ответ

0

В вашем скрипте имеется несколько проблем с синтаксисом, вы можете использовать инструмент, например http://www.shellcheck.net/, для обнаружения некоторых ошибок. После отступа кода, здесь не является более правильным (не идеально) версия о том, что Вы писали:

for f in *.fq 
do 
    a=$(head -n1 "$f") 
    c=$(expr substr "$a" 2 3) 
    echo "$c" 
    nr=$(grep -w "HWI" "$f" | wc -l) 
    if [ "$c" == "HWI" ]; then 
     echo "The number of read of $f is $nr" 
    else 
     echo "Invalide Format" 
    fi 
done 
  • Нет необходимости в кавычки «» вокруг $ (..)
  • Нет необходимости трубы $ е эхо (не уверен, что вы пытаетесь сделать)
  • поставить кавычки «» оберточной переменные, чтобы избежать разбиения на слова

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

0

Ваш код уточнена:

#!/bin/sh 
for f in *.fq 
do 
a="$(head -n1 $f)" 
c=$(expr "substr $a 2 3") 
echo $c 
nr="$(grep -w "HWI" $f | wc -l)" 
if [ "$c"="HWI" ] ; 
then 
    echo $f "the number of read of $f is $nr" 
else 
    echo "Invalide Format" 
fi 
done 

Ошибки:

линии 1: отсутствует #

строка 5: неправильный синтаксис при помощи expr

строка 7: отсутствует котировка

строка 10: неправильный синтаксис с использованием echo

линия 12: отсутствует пространство после echo

последней строке: отсутствует для закрытия петли done

0

Этот тест [ "$c"="HWI" ] будет всегда быть правда.

Команда [ выполняет разные действия в зависимости от количества аргументов, которые она получает. Если задано 1 аргумент (дисконтирование обязательного ] последнего аргумента), он возвращает успех, если длина аргумента отлична от нуля.

Вы передаете один аргумент к команде [: "$c"="HWI" - эта строка будет иметь длину, по меньшей мере, четыре , так явно не равно нулю.

Для сравнения строк, вы хотите пространства вокруг оператора: [ "$c" = "HWI" ]

увидеть это все окровавленные детали того, как обрабатывается команда [: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html#tag_20_128


Мой переписан:

#!/bin/bash 
for f in *.fq; do 
    read -N3 first3 < "$f" 
    if [[ $first3 == "HWI" ]]; then 
     echo "number of reads: $f: $(grep -Fwc HWI "$f")" 
    else 
     echo "Invalide Format: $f" 
    fi 
done 
Смежные вопросы