Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: ошибка в массиве при вывоеде файлов  (Прочитано 3569 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн livanda

  • Автор темы
  • Участник
  • *
  • Сообщений: 233
  • За мной будущее! А что за вами?
    • Просмотр профиля
Привет я пишу простой код на баше. Цель его из txt файлов брать текст и приобразовать этот текст в qrCODE.
По моей логике код должен рабоать так. Скрипт создает пакпку елиси ее нет. Преходит в эту папку. Дальше в этой папке ищит все *.txt  файлы. И по очереди берд из них текст перадат его прогрмамме, программа содает qr  визитку.  Вроде все просто и код мой работий но с одим файлом :( . дебаг жалуется на то что он не переходи на другую страку как я хочу а берет все что он поулчат как общиее имя. Надеюсь понтно объяснисла.

Сам код.
#!/bin/bash   -x

DIR_SAVE="$HOME/Documents/qrcode"

mkdir -p "$DIR_SAVE" && cd "$DIR_SAVE"

for QR_FILE_LIST in "$(ls -d *.txt | cut -f1 -d'/')" ; do

        qrencode -s 6 -l H -o "$QR_FILE_LIST".jpg < "$QR_FILE_LIST"

        ls "$QR_FILE_LIST"
done #End QR_FILE_LIST



А вот это что дебаг дает

+ DIR_SAVE=/home/livanda/Documents/qrcode
+ mkdir -p /home/livanda/Documents/qrcode
+ cd /home/livanda/Documents/qrcode
++ ls -d My_contact.txt my_wifi.txt
++ cut -f1 -d/
+ for QR_FILE_LIST in "$(ls -d *.txt | cut -f1 -d'/')"
+ qrencode -s 6 -l H -o 'My_contact.txt
my_wifi.txt.jpg'
./MyUbuntuScripting/my_qrcode: line 9: My_contact.txt
my_wifi.txt: No such file or directory
+ ls 'My_contact.txt
my_wifi.txt'
ls: cannot access 'My_contact.txt'$'\n''my_wifi.txt': No such file or directory



Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6826
  • 20% Cooler
    • Просмотр профиля
Re: ошибка в массиве при вывоеде файлов
« Ответ #1 : 16 Августа 2021, 18:47:46 »
for QR_FILE_LIST in "$(ls -d *.txt | cut -f1 -d'/')" ; do
никогда не пытайтесь парсить вывод ls!

for QR_FILE_LIST in ./*.txt ; do
        qrencode -s 6 -l H -o "${QR_FILE_LIST##*/}".jpg < "$QR_FILE_LIST"
done
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3040
    • Просмотр профиля
Re: ошибка в массиве при вывоеде файлов
« Ответ #2 : 16 Августа 2021, 18:57:29 »
Почему же, и вывод ls можно парсить, например, вывод "ls -l /dev/disk/by-label" или by-uuid, у меня где-то делается,
но, если от ls нужен построчный вывод, надо использовать опцию "-1".
« Последнее редактирование: 16 Августа 2021, 19:02:48 от Peter_I »
Пётр.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6826
  • 20% Cooler
    • Просмотр профиля
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн livanda

  • Автор темы
  • Участник
  • *
  • Сообщений: 233
  • За мной будущее! А что за вами?
    • Просмотр профиля
Re: ошибка в массиве при вывоеде файлов
« Ответ #4 : 16 Августа 2021, 19:55:28 »

никогда не пытайтесь парсить вывод ls!


А связи с чем? вроде ls вывод делает файлов что мне было ножно, а тут такое.

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3040
    • Просмотр профиля
Re: ошибка в массиве при вывоеде файлов
« Ответ #5 : 16 Августа 2021, 19:57:15 »
ALiEN175, благодарю, статья интересная, но полностью я её ещё не изучал.
Однако любой регулярный текст можно разобрать, хотя бы и с использованием утилит,
например, тот вывод, который я привёл как пример.
Пётр.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6826
  • 20% Cooler
    • Просмотр профиля
Re: ошибка в массиве при вывоеде файлов
« Ответ #6 : 16 Августа 2021, 22:29:56 »
Peter_I, до тех пор, пока ls не покромсает вывод
Цитировать
совершенно не нужно использовать саму ls. Это внешняя команда, выходные данные которой специально предназначены для чтения человеком, а не для парсинга скриптом.
(Нажмите, чтобы показать/скрыть)
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3040
    • Просмотр профиля
Re: ошибка в массиве при вывоеде файлов
« Ответ #7 : 16 Августа 2021, 22:56:56 »
ALiEN175, с ls могут быть тонкости, например, один пробел в позиции или два,
или она может давать вывод якобы в одну строку и его надо превратить в многострочный,
но всё это решаемо, лишь бы была регулярность.
Пётр.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6826
  • 20% Cooler
    • Просмотр профиля
Re: ошибка в массиве при вывоеде файлов
« Ответ #8 : 17 Августа 2021, 00:18:26 »
но всё это решаемо, лишь бы была регулярность.
Это называется - "использовать костыли". Тяп-ляп - и в продакшен.
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3040
    • Просмотр профиля
Re: ошибка в массиве при вывоеде файлов
« Ответ #9 : 17 Августа 2021, 08:17:04 »
ALiEN175, сказать, что это костыли, можно в том случае, если есть более удобный вариант, чем с ls,
но сам по себе разбор вывода ls - это рутинная операция. Я же при этом знаю, что она возвращает
и мне нужна информация именно из её вывода, так что мне непонятно, почему это костыль.
Пётр.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6826
  • 20% Cooler
    • Просмотр профиля
Re: ошибка в массиве при вывоеде файлов
« Ответ #10 : 17 Августа 2021, 13:15:50 »
Я же при этом знаю, что она возвращает
Нет, не знаете
Цитировать
Утилита ls может искромсать имена файлов. В зависимости от платформы, на которой выработаете, от используемых вами аргументов (или не используемых), а также в зависимости от того, указывают ли на терминал стандартные выходные данные, ls может внезапно заменить какие-то символы в имени файла на "?". Или вообще их не выводить. Никогда не пытайтесь парсить выходные данные ls.
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3040
    • Просмотр профиля
Re: ошибка в массиве при вывоеде файлов
« Ответ #11 : 17 Августа 2021, 14:24:54 »
ALiEN175, так прежде чем парсить вывод ls, я же посмотрю его на экране, сохраню в файл и тогда уже
начну составлять команду или их последовательность. Как это она что-то внезапно заменит? Что она выведет
в 1-й раз, то же будет выводить и дальше, хотя могут быть тонкости, например, что отсутствующую цифру
заменяет пробелом и тогда надо её вывод с помощью tr приводить к виду, где поля разделяются одним пробелом.
Пётр.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6826
  • 20% Cooler
    • Просмотр профиля
Re: ошибка в массиве при вывоеде файлов
« Ответ #12 : 17 Августа 2021, 15:00:38 »
Peter_I, а потом перенесли скрипт на другую машину и там *внезапно* не работает.
Выше под спойлером я привёл пример, как ls реагирует на LANG. Одна и та же команда, а вывод абсолютно разный. Это совершенно недопустимо.
Еще хуже, когда составляете скрипт для других пользователей и выкладываете в интернет. Например, найдёшь какую-нибудь инструкцию в интернете, а она не рабочая, потому что автор нагородил костылей, но зато у него всё работает, а проблемы индейцев шерифа не волнуют.

Делать изначально нужно правильно, а не городить ерунду. В статье чётко и по полочкам разложено, почему нельзя парсить ls, а вы почему-то начинаете доказывать обратное.
« Последнее редактирование: 17 Августа 2021, 15:12:15 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3040
    • Просмотр профиля
Re: ошибка в массиве при вывоеде файлов
« Ответ #13 : 17 Августа 2021, 15:19:59 »
ALiEN175, да, я подумал, что на другом компьютере может выглядеть иначе,
но мне надо было разобрать вывод "ls -l /dev/disk/by-uuid".
Пример из-под спойлера впечатляет, но это уже проблема автора или системного администратора.
Всё предусмотреть невозможно, надо делать по правилам, тогда будет меньше трудностей.
Если локаль неправильно настроена, так ведь и другие утилиты будут, возможно, давать неправильный вывод?
Пётр.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6826
  • 20% Cooler
    • Просмотр профиля
Re: ошибка в массиве при вывоеде файлов
« Ответ #14 : 17 Августа 2021, 15:32:32 »
Если локаль неправильно настроена, так ведь и другие утилиты будут, возможно, давать неправильный вывод?
Возможно, но это уже за рамками этой темы.
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

 

Страница сгенерирована за 0.069 секунд. Запросов: 25.