motofan logo
26 страниц V « < 22 23 24 25 26 >        
> 

Написание скриптов #!/bin/sh for UNIX, Кто поможет?

VINRARUS
сообщение 17.6.2011, 17:56 Закрепленное сообщение!


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



Ура! В теме появилася шапочка. watsup.gif
В даной теме помогаем друг другу в написании шелл скриптов, и дружно решаем проблемы связанные с ними smile.gif

Вот мои рукописные мануалы для совсем новичков:
Основы. Синтаксис, кавычки, переменные, условные операторы
Розширенная инфа о if

Подробный мануал с примерами по ВСЕМ функциям SH
Портативная версия еще одного мануала
Книги в формате Djvu

Примеры работы с текстом через sed и мануал PRO и мануал NUB
Примеры работы с текстом через awk и мануал
Обрезка текста внутри переменных - чорт ногу сломит =] О логике шаблонов.

Где быстро найти инфу?
Тут вводите в строчку поиска манов любую утилиту, например echo, и 95% вероятности что получите инфу по всем функциям и ключам
Вот инфа по НЕКОТОРЫМ утилитам, также можна пользоваться поиском

ПС

1. Не во всех UNIX\LINUX системах можно сразу в терминале вводить команды утилит.
Например в MOTOMAGX часто перед командой утилиты нужно вводить "busybox" (например busybox free) хотя это и решено на некоторых модах.
А в некоторых выкидышах типа Android они и вовсе отсутствуют как и сам busybox, но есть возможность добавить его самому.

2. Не всегда утилиты поддерживают то что написано в манах к ним, иногда функционал меняется от версии к версии.

3. Также нужно знать что код от bash иногда может не работать корректно на shell (sh), хотя и очень редко.
Это из за того что древним программистам делать было нечего, когда не было еще интернета, и они понапридумывали кучу модификаций.
Хорошо хоть код под чистый shell подойдет ко всем им, из за чего он считается эталоном. smile.gif
А не bash как считают юные линуксойды.
[close]


Сообщение отредактировал VINRARUS - 12.12.2020, 21:32
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 9.1.2021, 13:11


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



Цитата(fill.sa @ Сегодня, 14:45)
* Я бы начал с того что у тебя под пк и магикс разные сборки если не версии будут. Вот и по разному работает.

Нет.
Цитата(fill.sa @ Сегодня, 14:45)
* Ну благо тут открытый код, можно негадать и открыть посмотреть как там на самом деле все происходит и главное почему.

Ага, в одном окне открыть код dash, а рядом в другом код Linux... и построчно отследить.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 9.1.2021, 19:12


Гуру
******

Группа: Разработчики
Сообщений: 1 226
Регистрация: 8.2.2011
Из: Беларусь
Пользователь №: 223 758
Модель телефона: z6 V8
Прошивка: Linux SAedition MOD

Рейтинг: 400



Цитата(VINRARUS @ Сегодня, 14:11)
* Нет.

Ты сам собирал и под магикс и под пк чтоли?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 9.1.2021, 20:53


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



Цитата(fill.sa @ Сегодня, 21:12)
* Ты сам собирал и под магикс и под пк чтоли?

Да. blind.gif Потому шо.

Сообщение отредактировал VINRARUS - 9.1.2021, 21:13
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 10.1.2021, 6:44


Гуру
******

Группа: Разработчики
Сообщений: 1 226
Регистрация: 8.2.2011
Из: Беларусь
Пользователь №: 223 758
Модель телефона: z6 V8
Прошивка: Linux SAedition MOD

Рейтинг: 400



VINRARUS,
А зачем дебиановский пакет под сусю собирал? Чем ванильная версия плоха? Или сусевская версия если есть.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 10.1.2021, 11:12


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



fill.sa, смотри 2ю ссылку, там всё описано. grin.gif

Добавлено позже (10.1.2021, 14:47):
ПС: куда уж ванильнее Дебиановской. wink.gif

Сообщение отредактировал VINRARUS - 10.1.2021, 11:13
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 25.9.2021, 5:05


Rock The Microphone
********

Группа: Администраторы
Сообщений: 2 872
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652
Модель телефона: XT894 / XT897
Прошивка: Различные


Настроение:
null



Рейтинг: 4598.5



VINRARUS, fill.sa,
Я плохо знаю Shell, но может кто поможет, суть в том, что есть такая вот тестовая директория:

Код
$ ls -l ~/Downloads/test/
total 0
-rw-rw-r--. 1 exl exl 0 Sep 25 11:52 'file name.tar.gz'
-rw-rw-r--. 1 exl exl 0 Sep 25 11:52  filename.tar.gz
-rw-rw-r--. 1 exl exl 0 Sep 25 11:55  namefile.tar.gz

И есть вот такой однострочник, который отлично отрабатывает если в имени файла нет пробела:

Код
find ~/Downloads/test -type f -name "*.tar*" | xargs -n1 sh -c 'echo $0 `basename $0 | sed -E 's/\.tar//g'`'

Но если в имени файла имеется пробел, он лажает:

Код
$ find ~/Downloads/test -type f -name "*.tar*" | xargs -n1 sh -c 'echo $0 `basename $0 | sed -E 's/\.tar//g'`'
/home/exl/Downloads/test/filename.tar.gz filename.gz  # Тут всё отлично
/home/exl/Downloads/test/namefile.tar.gz namefile.gz  # Тут всё отлично
/home/exl/Downloads/test/file file                    # Тут начинается лажа
name.tar.gz name.gz

Как мне правильно заэкранировать эти пробелы? Пробовал оборачивать $0 в кавычки "$0" -- не помогает.

ps.gif Однострочник должен выполнянться в окружении MotoMAGX-телефонов на стандартных прошивках, поэтому последние навороты GNU Bash и прочих могут не сработать.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 25.9.2021, 11:22


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



Цитата(EXL @ Сегодня, 8:05)
* $ find ~/Downloads/test -type f -name "*.tar*" | xargs -n1 sh -c 'echo $0 `basename $0 | sed -E 's/\.tar//g'`'

Ну начнём с ошыбок
я всегда с них начинаюИзображение
Код
'echo $0 `basename $0 | sed -E 's/\.tar//g'`'

Тут одинарныє кавычки нейтрализуют наклонные кавычки, а так как там 2 пары одинарных кавычок то команда логически разбивается на 3 части:
Код
'echo $0 `basename $0 | sed -E '
s/\.tar//g
'`'

Нада использовать двойные кавычки для sed, ну и заодно для basename 1м аргументом давать путь, а ещо уберём ненужный для 1 фильтра -E:
Код
'echo $0 `basename "$0" | sed "s/\.tar//g"`'

В даном случае баг не проявится, но если вместо ".tar" будет шото с пробелом то конструкцыя рассыпится по пробелах, а вот для basename проявился бы баг, если бы вначале не проявился.
А ещо
Код
sed "s/\\.tar//g"

опасно применять, так как имя файла file.tar.name.tar.gz будет изуродовано. Лучше изменить токо конечный кусок:
Код
sed "s/\\.tar\.gz\$/.gz/"

так надёжнее, тоже можна и для find применить. Конешно если токо tar.gz интересуют.
[close]

Цитата(EXL @ Сегодня, 8:05)
* Но если в имени файла имеется пробел, он лажает

Лажает именно xargs, он хочет кавычками отделённый ввод, а не строками:
Код
find ./ -type f -name "*.tar.gz" | sed -e 's/^/"/' -e 's/$/"/' | xargs -n1 sh -c 'echo $0 `basename "$0" | sed "s/\\.tar\.gz\$/.gz/"`'

Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 25.9.2021, 11:46


Rock The Microphone
********

Группа: Администраторы
Сообщений: 2 872
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652
Модель телефона: XT894 / XT897
Прошивка: Различные


Настроение:
null



Рейтинг: 4598.5



Цитата(VINRARUS @ Сегодня, 18:22)
* Лажает именно xargs, он хочет кавычками отделённый ввод, а не строками:

Спасибо! Посмотри пожалуйста, есть ли в xargs на MotoMAGX возможность использования такой штуки, как -d '\n'? Тогда по идее xargs лажать не будет и однострочник можно сократить до:

Код
find ~/Downloads/test -type f -name "*.tar*" | xargs -d '\n' -n1 sh -c 'echo "$0" `basename "$0" | sed "s/\\.tar\.gz\$/.gz/"`'

Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 25.9.2021, 13:44


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



Цитата(EXL @ Сегодня, 14:46)
* Посмотри пожалуйста, есть ли в xargs на MotoMAGX возможность использования такой штуки, как -d '\n'?

Пф, канешно жэ
Н Е Т Изображение
[close]

На тебе "однострочник" без мучений с утилитами:
Код
find ./ -type f -name "*.tar*" | while read FILE; do F1="${FILE%.tar*}"; F2="${FILE##*.tar}"; echo "$FILE ${F1##*/}$F2"; done

wink.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 25.9.2021, 14:52


Rock The Microphone
********

Группа: Администраторы
Сообщений: 2 872
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652
Модель телефона: XT894 / XT897
Прошивка: Различные


Настроение:
null



Рейтинг: 4598.5



VINRARUS,
И xargs -0 тоже нельзя? shok.gif

Цитата(VINRARUS @ Сегодня, 20:44)
* На тебе "однострочник" без мучений с утилитами:

На MotoMAGX он нормально на дефолтном Shell отработает? Если да, сделай ещё пожалуйста для такого варианта:

Код
$ find ~/Download/test -type f -name "*.gz*" | xargs -d '\n' -n1 sh -c 'echo "$0" `basename "$0" .gz`'
/home/exl/Downloads/test/filename.tar.gz filename.tar
/home/exl/Downloads/test/namefile.tar.gz namefile.tar
/home/exl/Downloads/test/file name.tar.gz file name.tar

То есть откидываем последнее расширение.

ps.gif А какой на MotoMAGX дефолтный Shell? Ash?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Написание скриптов #!/bin/sh for UNIX, Кто поможет? · Motorola на Linux OS · Forum
 

26 страниц V « < 22 23 24 25 26 >
Ответ в темуСоздание новой темы
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 28.3.2024, 8:00

Форум живёт: