Возникли проблемы с циклом while в скрипте bash - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь правильно настроить переменные в моем скрипте. В основном переменные x и y должны увеличиваться на 5 после каждой итерации цикла. Значение a должно увеличиваться на единицу, и цикл должен повторять количество раз $ numResults.

Переменная numResults работает нормально, и цикл действительно пытается повторить это число раз. Я сталкиваюсь с 4 наборами ошибок, поскольку это число хранится в этой переменной. Для других моих переменных, когда я заменяю их действительными числами, программа работает нормально, но не с переменными на месте.

    #!/bin/bash

# An application that for each course with more than 50 students enrolled generates 
# an advisory report to warn of over-enrollment. It generates a text file from a user-defined 
# template which uses the following variables:
# 
# • [[dept_code]]
# • [[dept_name]]
# • [[course_name]]
# • [[course_start]]
# • [[course_end]]
# • [[credit_hours]]
# • [[num_students]]
# • [[course_num]] (the course number as specified in the filename of the .crs file)
# • [[date]]
#
# Create a new user-specified subdirectory for files
mkdir -p "$4"

numResults=$(grep -rE --include \*.crs -e "^[5][1-9]$" -e "^[6-9][0-9]$" -e "^[1-9][0-9][0-9]$" "$1" | gawk '{n++} END { print n }')

let i=0;
x=1
y=5
a=1
while [[ $i<="$numResults" ]]
do
# Gets the course code and number to use as the output file name && stores course_num to the output file temporarily for retrieval
file=$(grep -rE --include \*.crs -e "^[5][1-9]$" -e "^[6-9][0-9]$" -e "^[1-9][0-9][0-9]$" "$1" | sed -E 's/.*([A-Z]{3})([0-9]{4})\.*crs:[0-9][0-9]/\1\2/g' | gawk 'NR==$a { print; echo "" }')
course=$(echo $file | sed 's/[A-Z]//g')
(cat "$2"; echo ""; echo "$course";) > "$4/$file"


# Locate all files in the data directory with the .crs extension that also contain a line with 
# only a string "51" - "999" and grabs the contents of that file and stores them to the new 
# output file temporarily for retrieval
grep -hrEB 4 --include \*.crs -e "^[5][1-9]$" -e "^[6-9][0-9]$" -e "^[1-9][0-9][0-9]$" "$1" | gawk 'NR==$x,NR==$y{print}' >> "$4"/$file


# Create variables to hold the dept and course info
varCNum=$(gawk -v n=6 '{saved[FNR % n] = $0} ENDFILE {if (FNR >= n) print saved[(FNR + 1) % n]}' "$4"/$file)

varDC=$(gawk -v n=5 '{saved[FNR % n] = $1} ENDFILE {if (FNR >= n) print saved[(FNR + 1) % n]}' "$4"/$file)
varDN=$(gawk -v n=5 '{saved[FNR % n] = $0} ENDFILE {if (FNR >= n) print saved[(FNR + 1) % n]}' "$4"/$file | gawk '{for(i=2;i<=NF;i++){printf "%s", $i};}')

varCN=$(gawk -v n=4 '{saved[FNR % n] = $0} ENDFILE {if (FNR >= n) print saved[(FNR + 1) % n]}' "$4"/$file)
varCS=$(gawk -v n=3 '{saved[FNR % n] = $2} ENDFILE {if (FNR >= n) print saved[(FNR + 1) % n]}' "$4"/$file)
varCE=$(gawk -v n=3 '{saved[FNR % n] = $3} ENDFILE {if (FNR >= n) print saved[(FNR + 1) % n]}' "$4"/$file)
varCH=$(gawk -v n=2 '{saved[FNR % n] = $0} ENDFILE {if (FNR >= n) print saved[(FNR + 1) % n]}' "$4"/$file)

varNS=$(gawk -v n=1 '{saved[FNR % n] = $0} ENDFILE {if (FNR >= n) print saved[(FNR + 1) % n]}' "$4"/$file)


# Substitute the variables into the output file && and clean up
sed -E "s/\[\[ dept_code \]\]/$varDC/g; s/\[\[ dept_name \]\]/$varDN/g; 
s@\[\[ course_name \]\]@$varCN@g; s@\[\[ course_start \]\]@$varCS@g; s@\[\[ course_end \]\]@$varCE@g;
s@\[\[ credit_hours \]\]@$varCH@g; s@\[\[ num_students \]\]@$varNS@g; 
s@\[\[ course_num \]\]@$varCNum@g; s@\[\[ date \]\]@$varDate@g;" "$4"/$file | sed -e :a -e '$d;N;2,6ba' -e 'P;D'

let i+=1
let x+=5
let y+=5
let a+=1

done

Я передаю следующие аргументы моему сценарию: $. /assign4.sh ./data assign4.template 12/16/2021 ./output

Which gives the following error message "./assign4.sh: line 31: ./output: Is a directory
./assign4.sh: line 37: ./output: Is a directory
gawk: warning: command line argument `./output' is a directory: skipped"

1 Ответ

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

Хотя ваше требование не совсем ясно, если вы видите, что ваша ошибка выглядит так, как будто вам необходимо указать полный путь к вашим каталогам / файлам, в которые вы хотите записать вывод и т. Д.

./assign4.sh "/your_complete_path/data assign4.template" "12/16/2021" "/your_complete_path/output"

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

...