Почему я получаю эту ошибку файла и ошибку cat, хотя я передаю текстовый файл в аргументе? - PullRequest
0 голосов
/ 18 октября 2019

Программа требует, чтобы мы прочитали в каталоге, полном текстовых файлов, проанализировали данные из этих файлов в их соответствующие атрибуты.

Затем, как только данные установлены, загрузите общий шаблон, который имеет эти атрибуты втекст. Я использую команду sed для замены определенных атрибутов, только если число студентов превышает 50. Если это так, он запускает команду sed и записывает в файл и в каталог.

Но яя получаю эту ошибку, когда я передаю

test3.sh ./data assign4.template 12/16/2021 ./output

Ошибка

cat: assign4.template: No such file or directory
test3.sh: line 62: output/MAT3103.crs: No such file or directory
The current file is MAT4353.crs

Теперь я думаю, что из-за ошибки файла или каталога она ищет в этой папке ипоиск файла с таким именем

Но не совсем уверен, как его решить.

Что касается ошибки cat: template, я не получаю этого, так как передаю шаблон в терминале

Что касается других передаваемых параметров, Date, который также подставляется в команду sed. Все выходные файлы должны быть записаны в каталог, определенный последним аргументом. Этот каталог может или не может уже существовать. Каждый файл должен быть назван по коду и номеру отдела курса, а также с расширением. Warn

Вот общий код

#!/bin/bash

# checking if user has passed atleast four arguments are passed
if [ $# -ne 4 ]
then
    echo "Atleast 4 argument should be passed"
    exit 1
fi

# if output directory exits check
if [ -d output ] 
then
    # if output directory exists will get deleted
    echo "output directory already exists. So removing its contents"
    rm -f output/*
else
    # output directory does not exist, so gets created here
    echo "output directory does not exist. So creating a new directory"
    mkdir output
fi

max_students=50
template=$2
dt=$3

cd $1
    for i in *; do
    echo The current file is ${i}

    dept_code=$(awk 'NR==2
    {print $1 ; exit}' $i)
    echo $dept_code

    dept_name=$(awk 'NR==2
    {print $2 ; exit}' $i)
    echo $dept_name

    course_name=$(awk 'FNR==2' $i)
    echo $course_name

    course_sched=$(awk 'FNR==3' $i | awk '{print $1}')

    course_sched=$(awk 'FNR==3' $i | awk '{print $1}')
    echo $course_sched

    course_start=$(awk 'FNR==3' $i | awk '{print $2}')
    echo $course_start

    course_end=$(awk 'FNR==3' $i | awk '{print $3}')
    echo $course_end

    credit_hours=$(awk 'FNR==4' $i)
    echo $credit_hours

    num_students=$(awk 'FNR==5' $i)
    echo $num_students

    # checking if number of students currently enrolled > max students
    if (( $(echo "$num_students > $max_students" |bc -l) ))
    then
# output filename creation
    out_file=${i}
# using example Template and sed command to replace the variables
    cat $template | sed -e "s/\[\\[\dept_code\]\]/$dept_code/" | sed -e "s/\[\\[\dept_name\]\]/$dept_name/" | sed -e "s|\[\[course_name\]\]|$course_name|" | sed -e "s|\[\[course_start\]\]|$$

fi

done

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Вы определяете переменную как

template=$2

, и так как ваш второй параметр assign4.template, это то, что переменная template установлена. Затем вы делаете

cat $template

, что, в первую очередь, не нужно, поскольку вместо этого вы можете выполнить перенаправление ввода на sed, но больше всего требуется, чтобы файл существовал в вашем рабочем каталоге. Поскольку вы сделали до

cd $1

, это означает, что файл data/assign4.template не существует. Вам нужно создать этот файл, прежде чем вы сможете использовать свой скрипт.

0 голосов
/ 18 октября 2019

используйте одинарные кавычки в ваших позиционных аргументах.

test3.sh './data' 'assign4.template' '12/16/2021' './output'

или

test3.sh data assign4.template '12/16/2021' output

...