2016-12-03 14 views
1

Мне поручено написать сценарий оболочки, который берет строку из 6 букв и цифр и проверяет, соответствуют ли они определенным критериям.Как использовать содержимое текстового файла в качестве входа в сценарий оболочки?

Это тот сценарий

FILE=$1 
var=${#FILE} 
if [ $var -gt 6 ] || [ $var -lt 6 ] 
then 
    #echo $FILE "is not a valid NSID" 
    exit 1 
else if (echo $1 | egrep -q '^[A-Za-z]{3}\d{3}$') 
    then 
     #echo $1 "is a valid NSID" 
     exit 0 
    else 
     #echo $1 "is not a valid NSID" 
     exit 1 
    fi 
fi 

Он работает. так что это не проблема.

То, что я пытаюсь сделать, это использовать сценарий «обертка» для сбора потенциальных действительных NSID из текстового файла и вызова этого сценария в списке входов. так что, если я вызову этот скрипт в моем сценарии оболочки, он перейдет через текстовый файл, который я дал моей оболочке, и проверьте, действительно ли каждая строка.

FILE=$1 
YES= more $FILE 

if (exec /path/to/file/is_nsid.sh $YES -eq 0) 
then 
    echo $FILE "is a valid NSID" 
else 
    echo $FILE "is not a valid NSID" 
fi 

так, если бы я назвал его с текстовым файлом под названием file1.txt, который содержал

yes123 
yess12 
ye1243 

он будет выводить каждый из них был ли действительным или нет.

ответ

2

Линия

YES= more $FILE 

Наборы YES в среде передается команде more $FILE. Вероятно, это не то, что вы намеревались.

Линия

if (exec /path/to/file/is_nsid.sh $YES -eq 0) 

начинает подоболочку для выполнения exec /path/to/file/is_nsid.sh $YES -eq 0. (Это то, что круглые скобки.) exec затем заменяет подоболочку с процессом, который выполняет

/path/to/file/is_nsid.sh $YES -eq 0 

, который в свою очередь запускает сценарий на is_nsid.sh, передавая ему два или три аргумента командной строки:

  • значение $YES. Это может быть несколько аргументов, если значение переменной оболочки включает пробел или символ глобуса, но в этом случае с большей вероятностью будет ничего, поскольку $YES не был определен.

  • -eq

Поскольку сценарий рассматривает только первый аргумент, что, вероятно, эквивалентно

/path/to/file/is_nsid.sh -eq 

Это будет, по-видимому, завершается с кодом состояния отказа, и поскольку подоболочка была заменена выполнением скрипта, который также будет статусом возврата подоболочки. (Без exec не было бы никакой разницы, статус возврата субголовы - это последняя команда, выполненная в подоболочке. Без скобок или exec, результат тоже будет таким же. Таким образом, вы могли бы просто написать if /path/to/file/is_nsid.sh $YES -eq 0 и это дало бы тот же неверный результат.)

То, что вы, по-видимому, хотели сделать, это прочитать каждую строку в файле, чье имя передается в качестве первого аргумента командной строки сценарию.Вы можете сделать это следующим образом:

while read -r line; do 
    if /path/to/file/is_nsid.sh "$line"; then 
    echo "$line is a valid NSID" 
    else 
    echo "$line is not a valid NSID" 
    fi 
done < "$1" 

Вы могли бы упростить is_nsid сценарий значительно. Следующее эквивалентно:

[ $#1 -eq 6 ] && echo "$1" | egrep -q '^[A-Za-z]{3}\d{3}$' 

Обратите внимание, что \d является расширение Gnu до и не задать расширенное следует полагаться в переносимый код (который я предполагаю, что это пытается быть). Вместо этого вы должны использовать [0-9] или [[:digit:]].

Проверка длины фактически не нужна, поскольку регулярное выражение может соответствовать только шестисимвольным строкам. Лично я бы оставил его и просто использовать

echo "$1" | egrep -q '^[[:alpha:]]{3}[[:digit:]]{3}$' 

Я удалил все ненужные if заявления. Если бы я их оставил, я бы поменял else if ... then ... fi на просто elif ... then ..., чтобы избежать ненужных if гнездования.

+0

Это имеет большой смысл, спасибо за нарушение этого! но используя этот цикл while создает бесконечный цикл, вызывая первую строку в .txt снова и снова. Любая идея почему? – Tremors

+0

@tremors: извините; неправильное перенаправление. Должно быть исправлено сейчас. – rici