#bash
#bash
Вопрос:
Объяснение моего алгоритма:
Я пытаюсь выяснить, совпадает ли моя текущая работа, например, Write (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
Комментарии:
1. Я не думаю, что без ввода мы окажем большую помощь, поэтому, пожалуйста, отредактируйте свой вопрос, включив пример того, как это выглядит. Но обратите внимание, что в середине сообщения об ошибке есть возврат каретки (именно поэтому он возвращается в левую часть экрана и перезаписывает начало сообщения концом) — это может помочь удалить их из вашего входного файла.
2. код работает для меня, и я получаю желаемый результат без каких-либо сообщений об ошибках; аналогично тому, что упоминал @MarkReed, мне интересно, есть ли
r
где-то мошенник в миксе … если не в файле данных, то, возможно, в самом сценарии оболочки; для обоихsim.job
и вашего сценария оболочки, есть ливозвращатьod -c <filename> | tr ' ' 'n' | grep 'r'
какие-либо строкиr
? если это так, подумайте о запуске,dos2unix <filename>
а затем запуститеod/tr/grep
снова, чтобы проверитьr
, исчезло ли оно; в качестве альтернативы, перейдите прямо кdos2unix <filename>
, а затем посмотрите, работает ли скрипт без ошибок3. Я предполагаю, что это
/r
была опечатка, и так и должно бытьr
; вы можете эмулировать часть удаления символов вdos2unix
withtr -d 'r' < filename
; в то время какdos2unix
заменит исходный файл, вам нужно будет направить вывод изtr
в новый файл, а затем переместить этот файл обратно, чтобы перезаписать оригинал (очевидно, убедитесь, что новый файл выглядит хорошо, прежде чемперемещение / перезапись исходного файла); а еще лучше, уберите исходный файл с дороги …mv srcfile srcfile.dos
(?) … пока вы не подтвердите, что вам это больше не нужно4. приятно слышать, что это сработало, хотя я всегда немного сомневаюсь, что одна команда использует одно и то же имя файла для ввода и вывода (да, я знаю, в некоторых случаях это «нормально», но, как правило, это плохая привычка, потому что однажды вы перезапишете /удалите какой-нибудь большой файл — возможно, тот скрипт, на «совершенствование» которого вы потратили 3 дня? — это будет трудно восстановить); что касается траты 4 часов сегодня… надеюсь, это окупится в будущем, когда вы увидите
r
поведение… «ах, да, мне нужно выполнитьdos2unix
это» (или «какуюtr
команду markp сказал мне использовать?»)5. Да, чтобы повторить то, что сказал @markp, более безопасным способом сделать это было бы что-то вроде
tr -d 'r' < sim.job >sim.job.tmp amp;amp; mv sim.job.tmp sim.job
. Или даже лучше,mv sim.job sim.job.bak amp;amp; tr -d 'r' <sim.job.bak >sim.job
чтобы у вас все еще была резервная копия предварительногоtr
файла на случай, если вы испортите команду.
Ответ №1:
r
в моем входном файле были обнаружены ошибки, для решения этой проблемы я использовал команды:
- Чтобы проверить, есть ли
r
в файле:od -c <filename> | tr ' ' 'n' | grep 'r'
- Чтобы удалить мошенническое
r
использование:tr -d 'r' < filename
Еще раз спасибо @mark-fuso