Ответы пользователя по тегу bash
  • Как дописать сравнение на bash?

    @abcd0x00
    Надо понимать, что это вызов программы, а не просто конструкция
    [ 0E48-D3D6 == "$UUID" ]

    Если разложить на составляющие, получится
    [ - программа
    0E48-D3D6 - первый аргумент
    == - второй аргумент
    "$UUID" - третий аргумент
    ] - четвёртый аргумент

    Получится
    [ "0E48-D3D6" "==" "$UUID" "]"
    Ответ написан
    7 комментариев
  • Автодополнение команды из истории в bash?

    @abcd0x00
    Открой man bash и там почитай секцию про READLINE (найдешь через /^READLINE в less).
    Там работает множество Emacs'овых сочетаний. И инкрементальный поиск по истории через Ctrl + r - одно из них.
    Там можно управлять словами (вырезать, вставлять, менять местами, прыгать по словам), управлять символами, управлять строкой, там есть даже макросы.
    Пример

    Запись макроса, который вставляет символы abc, и дальнейший вызов его пять раз:
    C-x (
    abc
    C-x )
    M-5
    C-x e

    C - Ctrl
    M - Alt

    Выведет abcabcabcabcabc.
    Ответ написан
  • Как написать монтирование диска на bash?

    @abcd0x00
    Просто всё проделываешь руками, а потом каждую команду заносишь в shell-скрипт.

    Монтировать принято в /mnt.
    Для новой точки принято создавать отдельный каталог.

    Для монтирования нужны права суперпользователя. Поэтому скрипт ты пишешь обычный, но запускаешь его потом через sudo.
    (И совсем не обязательно затрагивать /etc/fstab для этого.)
    Ответ написан
  • Как запустить wget с данными из двух массивов?

    @abcd0x00
    makeun.sh
    #!/bin/bash
    
    read_lines_pair()
    {
        echo "$(head -$1 $2 | tail -1) $(head -$1 $3 | tail -1)"
    }
    
    convert_line()
    {
        sed 's/^/wget /; s%[^ ]*$%-O ./img/&.jpg%'
    }
    
    process()
    {
        local len=$(wc -l urls.txt | cut -d' ' -f1)
        for i in `seq 1 $len`; do
            read_lines_pair $i urls.txt names.txt | convert_line
        done
    }
    
    process


    Вывод
    [guest@localhost makeun]$ ./makeun.sh 
    wget http://url.ru/some?v=86ff8d97yguifidgijdhfkjghdflkgjdf -O ./img/1321231321321321321.jpg
    wget http://url.ru/some?v=879874g65df4g65d4gf65d4f65g4 -O ./img/4564654654564654654.jpg
    wget http://url.ru/some?v=d89f7g98df7g987fd98g7d98f7gfd -O ./img/4654654654654654564.jpg
    [guest@localhost makeun]$


    Потом просто этот вывод передаёшь на sh по каналу.
    ./makeun.sh | sh
    Ответ написан
    Комментировать
  • Как добавить строку в файлы linux скриптом?

    @abcd0x00
    sed -i -s '$a text' *.txt

    Пример
    [guest@localhost t]$ ls
    file1.txt  file2.txt  file3.txt
    [guest@localhost t]$ 
    [guest@localhost t]$ cat file1.txt 
    a
    [guest@localhost t]$ cat file2.txt 
    b
    [guest@localhost t]$ cat file3.txt 
    c
    [guest@localhost t]$ 
    [guest@localhost t]$ sed -i -s '$a text' *.txt
    [guest@localhost t]$ 
    [guest@localhost t]$ cat file1.txt 
    a
    text
    [guest@localhost t]$ cat file2.txt 
    b
    text
    [guest@localhost t]$ cat file3.txt 
    c
    text
    [guest@localhost t]$

    Ответ написан
    1 комментарий
  • Как часть скрипта "выкинуть" или обернуть в скрин?

    @abcd0x00
    Так вот можно ли каким нибудь образом к примеру часть скрипта (его выполнение) обернуть в скрин?

    Можно запустить её в фоновом режиме, добавив амперсанд на конце.
    Пример
    #!/bin/bash
    
    func1()
    {
        for i in {1..5}; do
            echo 1
            sleep 2
        done
    }
    
    
    func2()
    {
        for i in {1..5}; do
            echo 2
            sleep 4
        done
    }
    
    func3()
    {
        echo 3
        func1 &
        sleep 1
        echo 4
        func2 &
        sleep 1
        echo 5
        wait
    }
    
    func3
    
    exit 0

    Вывод
    [guest@localhost sh]$ ./t.sh 
    3
    1
    4
    2
    1
    5
    1
    2
    1
    1
    2
    2
    2
    [guest@localhost sh]$

    Ответ написан
    Комментировать
  • Как вырезать текст между двумя тэгами в xml?

    @abcd0x00
    Сначала готовишь текст, чтобы было поудобнее, потом обрабатываешь. Из-за этого два раз sed вызывается.
    text="\
    a
    b
    c
    x1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<description>
      Туалетная вода-спрей
      &lt;br&gt;ВОСТОЧНЫЙ ФУЖЕР
      &lt;br&gt;Мужчина в стиле ориентирован на успех, целеустремлен и созидателен. Мужественность, достоинство, уверенность – его главные черты,    наряду с чувственностью и романтичностью. Он любит комфорт, красивые вещи,   роскошную жизнь и выражает себя в классическом пок$
     &lt;br&gt;Ключевые слова: Уверенный, динамичный, мужественный, благородный,  элегантный, статусный, успешный</description>y1yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
    x2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<description>
      Туалетная вода-спрей
      &lt;br&gt;ВОСТОЧНЫЙ ФУЖЕР
      &lt;br&gt;Мужчина в стиле ориентирован на успех, целеустремлен и созидателен. Мужественность, достоинство, уверенность – его главные черты,    наряду с чувственностью и романтичностью. Он любит комфорт, красивые вещи,   роскошную жизнь и выражает себя в классическом пок$
     &lt;br&gt;Ключевые слова: Уверенный, динамичный, мужественный, благородный,  элегантный, статусный, успешный</description>y2yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
    d
    e
    f
    "
    
    echo -n "$text"
    
    echo -n "$text" | sed 's%<description>%&x|||%g; s%</description>%|||x&%g' \
                    | sed '/x|||/ { :join N; /|||x/! b join ; s/x|||.*|||x// }'

    Вывод
    [guest@localhost ~]$ text="\
    > a
    > b
    > c
    > x1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<description>
    >   Туалетная вода-спрей
    >   &lt;br&gt;ВОСТОЧНЫЙ ФУЖЕР
    >   &lt;br&gt;Мужчина в стиле ориентирован на успех, целеустремлен и созидателен. Мужественность, достоинство, уверенность – его главные черты,    наряду с чувственностью и романтичностью. Он любит комфорт, красивые вещи,   роскошную жизнь и выражает себя в классическом пок$
    >  &lt;br&gt;Ключевые слова: Уверенный, динамичный, мужественный, благородный,  элегантный, статусный, успешный</description>y1yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
    > x2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<description>
    >   Туалетная вода-спрей
    >   &lt;br&gt;ВОСТОЧНЫЙ ФУЖЕР
    >   &lt;br&gt;Мужчина в стиле ориентирован на успех, целеустремлен и созидателен. Мужественность, достоинство, уверенность – его главные черты,    наряду с чувственностью и романтичностью. Он любит комфорт, красивые вещи,   роскошную жизнь и выражает себя в классическом пок$
    >  &lt;br&gt;Ключевые слова: Уверенный, динамичный, мужественный, благородный,  элегантный, статусный, успешный</description>y2yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
    > d
    > e
    > f
    > "
    [guest@localhost ~]$ 
    [guest@localhost ~]$ echo -n "$text"
    a
    b
    c
    x1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<description>
      Туалетная вода-спрей
      &lt;br&gt;ВОСТОЧНЫЙ ФУЖЕР
      &lt;br&gt;Мужчина в стиле ориентирован на успех, целеустремлен и созидателен. Мужественность, достоинство, уверенность – его главные черты,    наряду с чувственностью и романтичностью. Он любит комфорт, красивые вещи,   роскошную жизнь и выражает себя в классическом пок$
     &lt;br&gt;Ключевые слова: Уверенный, динамичный, мужественный, благородный,  элегантный, статусный, успешный</description>y1yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
    x2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<description>
      Туалетная вода-спрей
      &lt;br&gt;ВОСТОЧНЫЙ ФУЖЕР
      &lt;br&gt;Мужчина в стиле ориентирован на успех, целеустремлен и созидателен. Мужественность, достоинство, уверенность – его главные черты,    наряду с чувственностью и романтичностью. Он любит комфорт, красивые вещи,   роскошную жизнь и выражает себя в классическом пок$
     &lt;br&gt;Ключевые слова: Уверенный, динамичный, мужественный, благородный,  элегантный, статусный, успешный</description>y2yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
    d
    e
    f
    [guest@localhost ~]$ 
    [guest@localhost ~]$ echo -n "$text" | sed 's%<description>%&x|||%g; s%</description>%|||x&%g' \
    >                 | sed '/x|||/ { :join N; /|||x/! b join ; s/x|||.*|||x// }'
    a
    b
    c
    x1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<description></description>y1yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
    x2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<description></description>y2yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
    d
    e
    f
    [guest@localhost ~]$

    Ответ написан
    Комментировать
  • Почему выполнение скрипта всегда идет по ветке ELSE?

    @abcd0x00
    Программы возвращают код завершения (код возврата). Если grep нашла текст, она выводит найденный текст и возвращает успешный код завершения (ноль). Если grep не нашла текст, она не выводит ничего и возвращает провальный код завершения (единицу). Вот опция -q отключает только выводимый текст, а код завершения как возвращался, так и возвращается. В shell'е конструкция $() имеет дело только с выводимым текстом и не знает про код возврата. Поэтому для неё найденный и ненайденный тексты выглядят одинаково - в виде пустоты.
    Ответ написан
    Комментировать
  • Как выкусить подстроку из строки?

    @abcd0x00
    [guest@localhost ~]$ s="May 31 04:12:10 SSCK01 dhcpd[16691]: [ID 988538 local7.notice] [tid:30] NTCE DHCPOP(101) Protocol: DHCPDiscover from STRING-K01 PON 1/1/02/01:12.1.1 (chAddr=00:13:77:6d:44:6b) via 81.91.202.1."
    [guest@localhost ~]$ 
    [guest@localhost ~]$ echo "$s" | sed 's/.* from //; s/ (.*//'
    STRING-K01 PON 1/1/02/01:12.1.1
    [guest@localhost ~]$
    Ответ написан
    Комментировать
  • Как вывести отдельные строки в консоль с файла?

    @abcd0x00
    [guest@localhost ~]$ echo -e "Петя\nПетренко"
    Петя
    Петренко
    [guest@localhost ~]$ echo -e "Петя\nПетренко" | sed '1s/^/Имя: /; 2s/^/Фамилия: /'
    Имя: Петя
    Фамилия: Петренко
    [guest@localhost ~]$
    Ответ написан
    Комментировать
  • Как выполнить многостроковый поиск на bash с использованием сложного регулярного выражения?

    @abcd0x00
    Скорее всего, ты пытаешься решить задачу не с той стороны. Надо не ERROR искать, а потом восстанавливать строку, а сначала составлять каждую отдельную строку и потом, если там есть ERROR, выводить её.
    Ответ написан
  • Количество строк кода от *.coffee и *.py файлов на баше?

    @abcd0x00
    find -type f \( -name '*.coffee' -o -name '*.py' \) -exec cat {} \; | wc -l
    Ответ написан
    Комментировать
  • Как сделать красивый текст в терминале?

    @abcd0x00
    И сразу второй вопрос, как создаются такие окна в терминале, которые реагируют на мышь?

    Есть программы, в которых реализованы окна для использования в скриптах.

    Для консоли - пакет dialog.
    Для графического интерфейса - пакеты kdialog, xdialog, gtkdialog, yad.
    Ответ написан
    Комментировать
  • Как при помощи bash создать и трансформировать дерево директорий в .json?

    @abcd0x00
    Нужно написать пару функций, одна из который рекурсивная. Одна функция отвечает за вывод директории, а другая - за вывод файла. Директорная функция вызывает саму себя для директорий и файловую функцию - для файлов. А файловая функция возвращает путь к файлу.

    Ты просто выведи дерево файлов на экран без всякого json'а с помощью этих функций. Когда будет готово, увидишь, куда нужно вставить скобки, запятые и кавычки, чтобы из этого json получился.
    Ответ написан
    Комментировать
  • Непростая задача для vim?

    @abcd0x00
    В Emacs'е элементарно делается.

    Вставляешь начальную строку, переходишь на следующую строку и включаешь запись макроса.

    Записываешь макрос:
    1. вставить строку
    2. перейти на три слова влево
    3. выделить слово
    4. запустить встроенный калькулятор с нулевым аргументом
    5. добавить единицу
    6. выключить калькулятор
    7. вернуться в начало строки
    8. выделить строку до конца
    9. скопировать строку
    10. перейти на следующую строку

    Потом запускаешь этот макрос и он пишет каждый раз по новой строке. Когда доходишь до 125, останавливаешься и переходишь на последнюю строку.
    Потом просто склеиваешь строки через пробел до самого верха.
    Потом просто заменяешь пробелы на запятые до конца буфера.

    У меня это всё занимает 20 секунд (если не спешить) от вставки первой строки до получения конечного списка.

    В Vim'е, наверное, тоже всё это есть. Лучше приучиться к макросам, потому что это тут повезло, что скрипт можно легко написать, так как строки не сильно отличаются. А бывает так, что нужно выделить какие-нибудь части из html-исходника, которые не всегда точно определены.
    Ответ написан
    Комментировать
  • Что не так в скрипте по сбору информации о системе Ubnutu?

    @abcd0x00
    но при запуске в строке сбора данных о процессоре происходит ошибка:

    Эта ошибка происходит из-за выпадения скобок из двойных кавычек.
    Аналогичный вариант:
    [guest@localhost ~]$ s="abc"def(g)"hij"
    bash: syntax error near unexpected token `('
    [guest@localhost ~]$


    Исправить можешь так:
    [guest@localhost ~]$ s="abc'def(g)'hij"
    [guest@localhost ~]$
    Ответ написан
    Комментировать
  • Стоит ли учиться писать скрипты на bash?

    @abcd0x00
    Скриптов не так много, их как-то неудобно хранить и бэкапить.
    Зато много функций, которые закидываются в инициализационный файл.
    И вот они-то и используются постоянно.

    Когда внешний интернет пропадает
    Код
    # Print popup message
    # Say(message, seconds)
    Say()
    {
        kdialog --passivepopup "$1" ${2:-3}
    }
    
    # Ping server until it wakes up
    # Connect([site="www.yandex.ru"
    #         [, count=1
    #         [, interval=3
    #         [, message="connected"]]]])
    Connect()
    {
        local site="www.yandex.ru"
        local count=1
        local interval=3
        local message="connected"
    
        [ "$1" = "--help" ] && {
            echo "usage: $FUNCNAME [site[, count[, interval[, message]]]]"
            echo "       $FUNCNAME $site $count $interval $message"
            return 1
        } 1>&2
        [ -n "$1" ] && site="$1"
        [ -n "$2" ] && count="$2"
        [ -n "$3" ] && interval="$3"
        [ -n "$4" ] && message="$4"
    
        while ! ping -c $count "$site"; do
            sleep $interval;
        done
        Say "$message"
    }



    Когда надо клип с YouTube скачать
    Код
    # Download YouTube video in selected format
    # Ytf(url, ofile[, fmt=18])
    Ytf()
    {
        [ $# -eq 0 -o "$1" = "--help" ] && {
            echo "usage: $FUNCNAME url ofile [fmtn=18]"
            echo "       $FUNCNAME http://youtube 12345.flv"
            echo "       $FUNCNAME http://youtube 12345.flv 19"
            return 1
        } 1>&2
        n=${3:-18}
        youtube-dl -c -f "$n" "$1" -o "$2"
    }



    Иногда нужно размер файла узнать
    Код
    # Check access to url like a browser
    # SpiderB(url[, agent])
    SpiderB()
    {
        agent=${2:-Wget}
        wget --spider --user-agent="$agent" "$1"
    }

    Ответ написан
    Комментировать
  • Что делает цикл for в данной функции bash?

    @abcd0x00
    Что делает цикл for в данной функции bash?

    Он просто берёт из num каждый символ в обратном порядке.

    digit=${num:$t:1} #????

    [guest@localhost ~]$ s=abcd
    [guest@localhost ~]$ echo "${s:0:3} ${s:0:2} ${s:2:1}"
    abc ab c
    [guest@localhost ~]$
    Ответ написан
    1 комментарий
  • Как решить проблему зеркалирования кавычек SQL-запроса?

    @abcd0x00
    Общий принцип - сделать функцию для подготовки нужного вывода
    #!/bin/bash
    
    func()
    {
        local tab date freq
        local text
    
        tab=$1
        date=$2
        freq=$3
    
        text="INSERT INTO $tab ('id', 'name', 'update', 'data')"
        text="$text VALUES (NULL, 'cpucurfreq', '$date', '$freq');"
    
        echo "$text"
    }
    
    cat -n <<EOF
    `func "a" "b  b" "c  c"`
    `func "a" "e  e" "f  f"`
    EOF
    
    exit 0


    Вывод
    [guest@localhost sh]$ ./t.sh 
         1  INSERT INTO a ('id', 'name', 'update', 'data') VALUES (NULL, 'cpucurfreq', 'b  b', 'c  c');
         2  INSERT INTO a ('id', 'name', 'update', 'data') VALUES (NULL, 'cpucurfreq', 'e  e', 'f  f');
    [guest@localhost sh]$
    Ответ написан
    Комментировать
  • Как запустить баш скрипт, с передачей параметра при запуске?

    @abcd0x00
    Если нужно разделить команды (одни от одного пользователя, другие - от другого), то можно внутри скрипта использовать sudo.

    Скрипт
    #!/bin/bash
    
    user=${1:-guest}
    
    whoami
    sudo -u "$user" whoami
    
    exit 0


    Вызов
    [guest@localhost sh]$ ./t.sh guest
    guest
    guest
    [guest@localhost sh]$ ./t.sh apache
    guest
    apache
    [guest@localhost sh]$
    Ответ написан
    Комментировать