Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

Открыть новую тему     Написать ответ в эту тему

digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи вопрошающие! Если ваша система отлична от ГНУ, и в то же время вы желаете обойтись только дефолтными средствами, указывайте и то и другое сразу, пожалуйста.


UNIX Shell

 
   Это глобальная тема по юниксовой командной оболочке, как по интерактивной работе в командной строке, так и по шелл-скриптам. Ключевые слова: sh, bash, zsh, tcsh, busybox, readline, coreutils, cp, mv, ln, rm, ls, readlink, mkdir, touch, stat, date, test, sleep, chown, chmod, chattr, dd, df, du, env, echo, cat, less, man, grep, sort, findutils, find, locate, xargs, md5sum, cmp, diff, patch, ps, kill, killall, tar, gzip, bzip2, xz, mount, fdisk, parted, mkfs, fsck, e2fsprogs, mtools, ss, netcat, netstat, rsync, ssh, scp, sftp, lftp, ncftp, time, strace.
   Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь.
   Смотри в других ветках: wget, convert, montage, mogrify и др., gs, git, 7z, p7zip, soffice, mplayer, mencoder, vlc, vim, mc, mcedit, kioclient.
 
 

Hint! Русские маны (подустаревшие, не всегда полные и не всегда для вашей системы) можно попытаться найти на Опеннете, к примеру: bash, tar, grep.

 
Готовые решения:
  • commandlinefu.com
    Крупнейшая база полезных однострочников на командной оболочке с ранжированием на основе пользовательского голосования.
     
  • shell-fu.org
    Аналогично, но поменьше и формат записей более свободный, поэтому встречаются и однострочники, и развернутые скрипты, и просто советы.
     
  • Useful one-line scripts for sed
    Почти исчерпывающий список решений для тех случаев, когда sed незаменим. Более сложные скрипты с sed.sf.net — только для тех, кто знает толк... :)

 
Учебная литература:
  • Greg’s Wiki (http://mywiki.wooledge.org)
    Наиболее обширный авторский сборник постоянно обновляющихся материалов по Башу.

    1. Bash Pitfalls
      (Частые ошибки программирования на Баше: [1], [2], [3], [4], [5] — пер. на русский по сост. на дек. 2008 г.).
      Рассмотрены преимущественно ошибки, возникающие из-за непонимания отличия шелла от «нормальных» скриптовых языков. Если вы уже владеете, например, Перлом, то это вполне может быть ваше первое руководство для ознакомления с Башем.
    2. Bash FAQ
    3. Bash Guide
    4. Bash Reference Sheet
      Шпаргалка по частым синтаксическим оборотам.

 
Классическая учебная литература:
С одной стороны не упомянуть эти издания нельзя, с другой — они настолько устарели, что едва ли их можно рекомендовать в роли учебника.

 

Смело правьте и дополняйте шапку, однако не забывайте отписываться об исправлениях и сохранять исходный вариант под #.
Первый пост темы имел вид...

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 18:51 16-05-2008 | Исправлено: qw12, 09:42 24-03-2020
alexnov66



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Куда ёщё подробнее, в переменной название с точками, к примеру доменное имя, srv.domain.ru, нужно убрать точки и выдать новую переменную без точек. На windows это просто делается а на centos не соображу как сделать, желательно стандартными средствами bash
Не только к примеру точки но и любые знаки введённые которые не должны быть в названии, можно как убрать так и заменить один на другой.
 
убираем знаки с имени
 
set newname=%name%
set newname=%newname:.=%
set newname=%newname:-=%
set newname=%newname:_=%
 
или заменить знак один на другой
 
set newname=%name%
set newname=%newname:.=_%
 
И в переменной newname как небудет точек так если нужно можно заменить точки на нижнее подчеркивание, и получится название к примеру srv_domain_ru, переменную name изменять нельзя так как она используется дальше в скрипте.

Всего записей: 1195 | Зарегистр. 29-08-2005 | Отправлено: 01:43 28-06-2021 | Исправлено: alexnov66, 01:57 28-06-2021
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Куда ёщё подробнее

ну-ну...
name=t.e.s.t
$ echo "${name//.}"
test
$ echo "${name//./_}"
t_e_s_t

 
name=t.e.s.t
$ echo $name | tr -d \.
test
$ echo $name | sed 's/\.//g'
test
echo $name | sed 's/\.//g'
test
$ echo $name | sed 's/\./_/g'
t_e_s_t

 

Всего записей: 7322 | Зарегистр. 08-09-2001 | Отправлено: 09:53 28-06-2021
karavan



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
los
Цитата:
name=t.e.s.t
$ echo "${name//.}"
test
$ echo "${name//./_}"
t_e_s_t
 
 
name=t.e.s.t
$ echo $name | tr -d \.
test
$ echo $name | sed 's/\.//g'
test
echo $name | sed 's/\.//g'
test
$ echo $name | sed 's/\./_/g'
t_e_s_t

Это все работа со значениями, а alexnov66 хочет странного - модификацию имен переменных.

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 11:41 28-06-2021
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
karavan

Цитата:
Это все работа со значениями, а alexnov66 хочет странного - модификацию имен переменных.

мне достаточно сложно понять чего он хочет, почему и просил его подробнее описать задачу.

Всего записей: 7322 | Зарегистр. 08-09-2001 | Отправлено: 12:06 28-06-2021
alexnov66



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
karavan

Цитата:
Это все работа со значениями, а alexnov66 хочет странного - модификацию имен переменных.

А в чем странность, в том что нужно изменить переменную ?
 
 
los
Маленько не то, вывод в консоль работает а переменная не изменяется.
 

Код:
 
#!/bin/bash
name="srv.domain.ru"
newname="$name"
echo "${newname//.}"
echo $newname
 

 
Всё получилось, спасибо, то что доктор прописал.
 

Код:
 
name="srv.domain.ru";
newname="${name//.}";
echo $newname;
 
name1="srv.domain.ru";
newname1="${name1//./_}";
echo $newname1;
 
name2="$(date +"%Y_%m_%d_%H_%M")";
newname2="${name2//_}";
echo $newname2;
 
 

Всего записей: 1195 | Зарегистр. 29-08-2005 | Отправлено: 18:02 28-06-2021 | Исправлено: alexnov66, 18:30 28-06-2021
Garrett

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Такой вопрос.
Вот такой скрипт завершается аварийно, если в some-program формируется код возврата отличный от нуля(16)

Код:
 
...
some-program
if [ "$?" -ne 0 ]
then echo "  Шаг завершился аварийно.\n  Задание снимается."  
     exit 1
fi
...

 
но если мы хотим сохранить протокол с помощью tee, то тогда код возврата 16 не доходит до if, и задание не снимается в случае ошибки в some-program

Код:
 
...
some-program  | tee prot.txt
if [ "$?" -ne 0 ]
then echo "  Шаг завершился аварийно.\n  Задание снимается."  
     exit 1
fi
...

 
Как можно это исправить?

Всего записей: 2730 | Зарегистр. 16-10-2003 | Отправлено: 10:09 05-07-2021
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Garrett
Это же bash?
1. Используйте всегда в bash [[ вместо [
2. В [[ не надо кавычить переменные
3. Вместо $? Вам подойдёт ${PIPESTATUS[0]}

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 11:01 05-07-2021 | Исправлено: Alukardd, 11:02 05-07-2021
Garrett

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Используется sh или ksh.
Вариант с ${PIPESTATUS[0]} я проверю.

Всего записей: 2730 | Зарегистр. 16-10-2003 | Отправлено: 11:32 05-07-2021
newhk



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, привет!
Мне нужно заменить текст в файле.
Заменить /home/user на /var
 
Делаю так:
 
sed 's|/home/user|/var|g' ./my_file.sh
 
Но изменения сохраняются в терминале, а файл остается неизмененным.
Как мне изменит сам файл?
 
 
Разобрался...
 
Надо использовать ключ -i
Т.е. так  
sed -i 's|/home/user|/var|g' ./my_file.sh

Всего записей: 400 | Зарегистр. 02-02-2009 | Отправлено: 14:28 10-07-2021 | Исправлено: newhk, 15:04 10-07-2021
karavan



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
newhk (пост)
Цитата:
sed 's/\/home\/user/\/var' ./my_file.sh
 
Подскажите пожалуйста, правильно я делаю?

Нет.
Синтаксически правильно должно быть как-то так:
sed -i 's/\/home\/user/\/var/' ./my_file.sh - заменит только первое вхождение в каждой строке
или так:
sed -i 's/\/home\/user/\/var/g' ./my_file.sh - заменит каждое вхождение во всем файле
 
Но с мешаниной слэшей глаз замыливается и упускает синтаксические ошибки.
Я бы сделал так:
's#/home/user#/var#g'

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 15:03 10-07-2021 | Исправлено: karavan, 15:06 10-07-2021
vtlseeker



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
newhk
's/\/home\/user/\/var/g'  
команда замены должна оканчиваться слэшем, флаг 'g' на случай нескольких вхождений искомой подстроки в строке

Всего записей: 386 | Зарегистр. 03-03-2009 | Отправлено: 15:03 10-07-2021
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
newhk

Цитата:
Заменить /home/user на /var
 
Делаю так:
 
sed 's|/home/user|/var|g' ./my_file.sh  

 
произведет замену не только  для '/home/user' но и для ''/home/user/doc' - '/var/doc' и т.п.

Всего записей: 7322 | Зарегистр. 08-09-2001 | Отправлено: 23:05 10-07-2021
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
del

Всего записей: 7322 | Зарегистр. 08-09-2001 | Отправлено: 12:10 15-07-2021 | Исправлено: los, 17:59 15-07-2021
vtlseeker



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не могу разобраться, почему в коде:

Код:
#!/bin/bash
 
test_func() {
  read -sn1 -u 2
  printf '%s\n' "$REPLY"
}
 
test_func

 
у команды read есть возможность прочитать stdin, используя stderr?

Всего записей: 386 | Зарегистр. 03-03-2009 | Отправлено: 19:41 25-09-2021
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vtlseeker
А почему нет? Хоть и весьма не ординарный способ.
Если ему сказали читать с FD 2 (aka stderr) вот он и прочитал. В случае интерактивного терминала все стандартные дескрипторы (0, 1, 2) привязаны к /dev/pts/NN, так что с него и прочитали.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 21:09 25-09-2021
vtlseeker



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Если ему сказали читать с FD 2 (aka stderr) вот он и прочитал.

Но почему вводимое с клавиатуры значение оказывается на stderr?
А в таком случае:

Код:
#!/bin/bash
 
 test_func2() {
   read -sn1 -u2
     printf '%s\n' "$REPLY"
}
       
 test_func1() {
   readarray -t
   printf '%s\n' "${MAPFILE[@]}"
   test_func2
}
 
printf '%s\n' "1st line" "2nd line" "3rd line" | test_func1
 

только прямо указав fd2, можно узнать значение. Со stdin ничего не читается ни с прямым указанием, ни без.

Всего записей: 386 | Зарегистр. 03-03-2009 | Отправлено: 06:27 26-09-2021
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vtlseeker
?
Всё отработало ровно как и в первом примере, не понял вот последнего вопроса. func1 прочитала stdin из pipe, как ей и было велено, а func2 читает из sterr, если ей сказать -u0 то она сразу вылетит, т.к. получит EOF моментально из-за того что func1 уже вычитала весь stdin.
Что же касается вопроса: почему оно вообще могёт читать с stderr, то я уже сказал что всё это (0, 1, 2) /dev/pts/NN устройство.
https://unix.stackexchange.com/questions/93531/what-is-stored-in-dev-pts-files-and-can-we-open-them

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 17:25 26-09-2021
vtlseeker



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
fd0 процесса становится writeonly после считывания EOF?
дескрипторы указывают на одно и то же устройство, верно?

Цитата:
не ординарный способ

можно пример обычного?
 
Добавлено:
т.е., чтобы без проблем считать клавиатурный ввод в вышеприведённом коде, проще открыть доп. дескриптор?

Всего записей: 386 | Зарегистр. 03-03-2009 | Отправлено: 22:13 26-09-2021
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vtlseeker
Цитата:
можно пример обычного?
не читать с stdout и stderr?.. Есть stdin — fd0, есть дескрипторы которые вы сами создали явно или не явно во время работы скрипта, вот их и используйте, а то что fd2 указывает на текущий псевдо-терминал — это лишь удачное совпадение (это не баг  — это фича), звучит примерно так.
 

Цитата:
дескрипторы указывают на одно и то же устройство, верно?
что за вопрос? Я 2 раза уже сказал что это так. выполните в любом окне терминала ls -l /proc/$$/fd/.
 

Цитата:
fd0 процесса становится writeonly после считывания EOF?  
нет, конечно, флаги не меняются. EOF вообще нельзя получить пока там есть кто-то пишущий, в случае pts, там всегда есть терминал. так что только явный отправленный EOF (Ctrl-D) туда его сгенерит. В случае если это часть pipe то там происходит следующее: первый readarray вычитал весь вывод printf  и тот закрылся, дальше read уже пытался читать из pipe с другой стороны которого ни кого не было, за что и получал моментальный EOF.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 23:23 26-09-2021 | Исправлено: Alukardd, 23:52 26-09-2021
vtlseeker



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
[Alukardd
Спс за разъяснения.

Цитата:
что за вопрос? Я 2 раза уже сказал что это так

не серчайте, в ваших ответах я не видел однозначности в том, что линки указывают на

Цитата:
одно и то же устройство


Всего записей: 386 | Зарегистр. 03-03-2009 | Отправлено: 23:41 26-09-2021
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru