Нет такого файла или каталога в Bash? - PullRequest
0 голосов
/ 03 октября 2019

Мой скрипт bash. После его завершения он получает line 9: 1570066642: No such file or directory

#!/bin/bash

DATE=$(date "+%s")

while read p; do

IFS=',' read -ra my_array <<< "$p"

if [ "${my_array[1]}" < "${DATE}" ] ; then
    continue
fi

echo "$p" >> my_file.txt

done <cache_data.txt

mv my_file.txt cache_data.txt

Я хочу проверить разницу между датами в секундах с отметкой времени.

1 Ответ

2 голосов
/ 03 октября 2019

Используйте (( для арифметических операций.

if ((${my_array[1]} < DATE)); then

Если вы используете [, вам нужно изменить < на -lt. В отличие от ((, [ не является специальным синтаксисом оболочки. Это обычная команда с необычным односимвольным именем, что означает, что оболочка интерпретирует < как перенаправление файла, а не как оператор меньше.

if [ "${my_array[1]}" -lt "${DATE}" ] ; then

Вы можете упростить read звонки. Вместо того, чтобы читать всю строку, а затем вызывать read во второй раз для анализа полей, разделенных запятыми, вы можете сделать оба сразу.

Вам также не нужно считывать результаты в массив. read может назначать несколько переменных одновременно.

Наконец, если вы выведете перенаправление >> my_file.txt из цикла, вы можете избежать открытия и закрытия файла на каждой итерации, хорошая оптимизация.

while IFS=',' read -r field1 timestamp rest_of_line; do
    ((timestamp >= DATE)) || continue
    echo "$field1 $timestamp"
done <cache_data.txt >my_file.txt

Мне нравится использовать && и || в качестве сокращения для if и if !. Это обычная идиома сценариев для быстрых тестов. Я использовал || выше, чтобы продемонстрировать. Вы можете найти это более или менее читабельным. Мнения разные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...