Объясняю свой алгоритм:
Я пытаюсь выяснить, является ли Моя текущая работа, например. Запись (W) совпадает с моей предыдущей работой, если моя текущая работа (W) такая же, как моя предыдущая работа (W), то проверьте, есть ли разница между ними в 1 целое число, например. если предыдущее задание было W9, а мое текущее задание — W8 или W10, то добавьте 0 к моему массиву поиска.
Я перепробовал почти все способы, которые смог найти в Интернете, для сравнения целых чисел, но ни один из них не работает, я продолжаю получать недопустимую арифметическую синтаксическую ошибку при попытке сравнить текущую и предыдущую работу.
Есть идеи?
# Jobs
lastJob = ""
currentJob = ""
lastNumber=0
currentNumber=0
# Arrays
seek=()
RW=()
shift 3
# Reads final into array
while IFS= read -r line
do
Job+=($line)
done < ./sim.job
#-----------------------------------
# Single HDD Algorithm
#-----------------------------------
for (( i=0; i<=${#Job[@]}; i++ ));
do
currentString = "${Job[$i]}"
currentJob=${currentString:0:1}
currentNumber=${currentString:1:3}
if [[ $currentJob == $lastJob ]]
then
if [[ $currentNumber -eq $lastNumber-1 ]] || [[ $currentNumber -eq $lastNumber+1 ]]
then
seek+=(0)
RW+=(60)
else
seek+=(5)
RW+=(60)
fi
else
seek+=(5)
RW+=(60)
fi
lastString = "${Job[$i]}"
lastJob=${lastString:0:1}
lastNumber=${currentString:1:3}
done
Это печатает вывод:
#-----------------------------------
# Print Information
#-----------------------------------
for (( i=0; i<${#Job[@]}; i++ ));
do
echo -e "${Job[$i]}:${seek[$i]}:${RW[$i]}"
done
Ожидаемый результат:
R9:5:60
W9:5:60
W10:0:60
R11:0:60
R13:5:60
R18:5:60
R19:0:60
R20:0:60
R21:0:60
Фактический результат:
") syntax error: invalid arithmetic operator (error token is "
R9:5:60
W9:5:60
W10::
R11::
R13::
R18::
R19::
R20::
R21::
Файл sim.job (вход):
R9
W9
W10
R11
R13
R18
R19
R20
R21
@MarkReed Я включил входной файл
код работает для меня, и я получаю желаемый результат без каких-либо сообщений об ошибках; в соответствии с тем, что упоминал @MarkReed, мне интересно, есть ли мошенник \r
где-то в миксе ... если не в файле данных, то, возможно, в самом сценарии оболочки; как для sim.job
, так и для вашего сценария оболочки od -c <filename> | tr ' ' '\n' | grep '\r'
возвращает какие-либо строки \r
? если это так, рассмотрите возможность запуска dos2unix <filename>
, а затем снова запустите od/tr/grep
, чтобы увидеть, исчез ли \r
; в качестве альтернативы, перейдите прямо к dos2unix <filename>
и посмотрите, работает ли скрипт без ошибок
@markp-fuso sim.job came back with 9x " /r "
HDD.sh came back with 46 " r "
без обратной косой черты, я пытался удалить строки "\r" с помощью dos2unix, но команда не распознается, и у меня нет доступа к администратору..
Я предполагаю, что ваш /r
был опечаткой и должен быть \r
; вы можете эмулировать часть удаления символов dos2unix
с помощью tr -d '\r' < filename
; в то время как dos2unix
заменит исходный файл, вам нужно будет направить вывод из tr
в новый файл, а затем переместить этот файл обратно, чтобы перезаписать оригинал (очевидно, убедитесь, что новый файл выглядит хорошо, прежде чем перемещать/перезаписывать исходный файл); еще лучше, переместите исходный файл в сторону ... mv srcfile srcfile.dos
(?) ... пока вы не подтвердите, что он вам больше не нужен
@markp-fuso tr -d '\r' < sim.job > sim.job
это устранило проблему ... Я только что потратил 4 часа своей жизни на отладку кода, который уже работал ..
приятно слышать, что это сработало, хотя я всегда немного сомневаюсь, чтобы одна команда использовала одно и то же имя файла для ввода и вывода (да, я знаю, что в некоторых случаях это «нормально», но обычно это плохая привычка получать в потому что однажды вы перезапишете/сотрете какой-нибудь большой файл — возможно, тот скрипт, который вы потратили на «доводку» 3 дня? — его будет трудно перегенерировать); что касается потраченных впустую 4 часов сегодня ... надеюсь, это окупится в будущем, когда вы увидите \r
поведение ... «ах, да, мне нужно запустить dos2unix
на этом» (или «что это была за tr
команда, которую мне сказал markp использовать?")
Да, чтобы повторить то, что сказал @markp, более безопасный способ сделать это будет что-то вроде tr -d '\r' < sim.job >sim.job.tmp && mv sim.job.tmp sim.job
. Или, что еще лучше, mv sim.job sim.job.bak && tr -d '\r' <sim.job.bak >sim.job
так что у вас все еще есть резервная копия файла pre-tr
на случай, если вы напортачите с командой.
мошенники \r
были найдены в моем входном файле, для решения этой проблемы я использовал команды:
Чтобы проверить, есть ли \r
в файле: od -c <filename> | tr ' ' '\n' | grep '\r'
Чтобы удалить мошенника \r
используйте: tr -d '\r' < filename
Еще раз спасибо @mark-fuso
Без ввода я не думаю, что мы будем очень полезны, поэтому, пожалуйста, отредактируйте свой вопрос, чтобы включить пример того, как это выглядит. Но обратите внимание, что в середине сообщения об ошибке есть возврат каретки (поэтому он возвращается в левую часть экрана и перезаписывает начало сообщения концом) — это может помочь удалить их из вашего входного файла. .