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

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Проблему следует решать так:

    dos2unix /home/user/list.txt
    while read; do
      ln -s "/usr/share/nginx/html/$REPLY" "/usr/share/nginx/html/tst/$REPLY"
    done < /home/user/list.txt


    P.S. кстати в твоем примере указано просто ln без ln -s, то есть ты хардлинки создаешь вместо символических ссылок.
    Ответ написан
    Комментировать
  • Как искать вхождения из списка фраз в linux?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    while read; do grep "$REPLY";done<file1
    Ответ написан
    Комментировать
  • Как получить вывод в рамке с переносом строк?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    MEM="Memory Usage: 277/1983MB (13.97%)"
    HDD="Disk Usage: 5/16GB (35%)"
    CPU="CPU Load: 0.00"
    
    banner() {
    max=$(echo -e "$1"|awk '{if(length>max)max=length}END{printf max}')
    echo -e "$1"|awk 'BEGIN{for(i=1;i<'$max'+4;i++){printf "#"};print "#"}{printf "# %'$max's #\n", $0}END{for(i=1;i<'$max'+4;i++){printf "#"};print "#"}'
    }
    
    banner "$MEM\n$HDD\n$CPU"


    $ banner "$MEM\n$HDD\n$CPU"
    #####################################
    # Memory Usage: 277/1983MB (13.97%) #
    #          Disk Usage: 5/16GB (35%) #
    #                    CPU Load: 0.00 #
    #####################################
    Ответ написан
    Комментировать
  • Как сравнить два файла в процентном соотношении?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Сам баш с дробными числами не работает, а bc по умолчанию имеет scale=0

    Пропишите в вашем скрипте scale=1 чтобы получить десятые доли процента, например

    bc -l <<< "scale=1;$full*$first/$second"
    Ответ написан
    Комментировать
  • Как в sed заменить строку c двойными кавычками и переменной?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    #!/bin/bash
    IP=$(wget -qO- someurl.com)
    GMT=(wget -qO- someurl.com?$IP)
    OLD="TimeZone=\"600\""
    REP="TimeZone=\"$GMT\""
    sed -i "s/$OLD/$REP/" test.txt
    
    sed  "s/TimeZone=\"[^\"]*\"/TimeZone=\"$GMT\"/g" test.txt
    Ответ написан
    Комментировать
  • Не могу понять в чём проблема в баш скрипте?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Это капец.
    Если начал учить скрипты час назад, научись писать отдельные команды синтаксически правильно, а не взять откуда-то нерабочий кусок текста и не понимать в чем дело.

    Для начала вставь свой скрипт сюда и проверь на синтаксис каждую строчку
    https://www.shellcheck.net/

    проверь в какую сторону смотрят кавычки, проставил ли ты правильно пробелы.
    И вообще, попроще пиши для старта
    Ответ написан
    Комментировать
  • K8s как запустить множество yml?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    ls -1 *.yml | xargs -n1 kubectl -f apply
    Ответ написан
    Комментировать
  • Почему служебные символы работают не везде?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Перенаправление ">" говорит о том, что ты хочешь перенаправить stdout в конкретный поток/файл.
    Но конструкция [1-5].txt это не имя файла, это wildcard, который развернется в пять файлов. А ">" у тебя один.
    То есть просто неправильный синтаксис, потому что для ">" можно указать только одно имя потока/файла.

    Читай справку о командах и понимать, где можно указать несколько файлов, а где только один.

    Говоря про "служебные символ", следует почитать документацию и различать их.
    Есть wildcards, есть variable expansion, есть regular expression, есть специальные переменные, есть команды самого баш, есть bash expansion. Зная какие к чему относится, можно понимать где и как их применять.
    Ответ написан
    Комментировать
  • Как удалить точку после домена?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    dig google.com +noall +answer|awk '{print $5" "substr($1,1,length($1)-1)}'
    Ответ написан
    Комментировать
  • Ожидание старта mysql?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Да банально, делаешь цикл в котором выполняешь простой sql запрос раз в несколько секунд, и если он прошел успешно, выходишь из цикла.
    Можно добавить в цикл таймаут по которому завершать скрипт с ошибкой.

    p.s. А вообще надо больше деталей. Если тебе автостарт при старте системы нужен, то через systemd можно указать зависимость.
    Ответ написан
    Комментировать
  • Как в bash скрипте определить является ли файл видео и получить его разрешение?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    как часть ffmpeg проекта, есть ffprobe, им и пользуйтесь.

    ffmpeg.org/ffprobe.html

    Получить можно в разном формате. И обычный текст(ini) или csv,xml,json

    Примеры:
    $ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=nw=1 "My video file.mpg" 
    width=704
    height=576


    $ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 "another vide file.mkv"
    1280,720


    $ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of json "one_more video.mkv"
    {
        "programs": [
    
        ],
        "streams": [
            {
                "width": 1152,
                "height": 480
            }
        ]
    }
    Ответ написан
    Комментировать
  • Как максимально просто и быстро переименовать файлы по маске?

    saboteur_kiev
    @saboteur_kiev Куратор тега Python
    software engineer
    Накидал какое-то рабочее решение.
    Должно работать с разными именами файлов в текущей директории, главное чтобы в файле был только один кусок с числом.

    То есть с таким набором файлов справится: file1.jpg file02.jpg file0035.jpg 36file.jpg, лишь бы числа не пересекались

    А с таким - НЕ справится: file1_1.jpg 01_file_02.jpg

    max=$(ls -1 | grep -oP "[0-9]*"|sort -n|tail -n1)
    length=$(sed "s/^0*//g"<<<"$max"|xargs expr length)
    echo "Max number found: [$max], max length: [$length]"
    
    ls -1|while read oldname; do
      oldnum="$(grep -oP "[0-9]*"<<<"oldname")"
      newnum=$(printf "%0${length}d" $(sed "s/^0*//g"<<<"$oldnum"))
      newname=$(sed "s/$oldnum/$newnum/g"<<<"$oldname")
      if [ -f "$newname" ]; then
        echo "Kinly check the following files manually: $oldname $newname"
      else
        echo "Renaming [$oldname] to [$newname]"
        # mv "$oldname" "$newname"
    done


    p.s. после проверки вывода, расскомментировать строчку с "# mv "
    Ответ написан
    Комментировать
  • Как в BASH работают логические операторы?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Однако, возникает вопрос - а как именно BASH преобразовывает результат выполнения определённой команды в булевое значение?

    Он это не делает. Он проверяет код возврата команды, который согласно архитектуре линукс - может иметь значение от 0 до 255 (байт)
    Просто значение 0 считается true, любое другое значение считается false

    На код ошибки это не похоже. Так как успешное выполнение команды возвращает 0. Что полностью противоречит алгебре логики.

    С чего это вдруг противоречит? Противоречит только в том случае, если вы не читали документацию.
    Ответ написан
    Комментировать
  • Как добавить в переменную множество значений (массив)?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    1. Для начала пробелы:
    mac=( "mac1" "mac2" )

    2. Во-вторых
    echo ${mac[0]}
    echo ${mac[1]}

    3. В-третьих
    export совершенно бессмысленный в данном случае, так как массив нельзя отправить в environment variables.
    Ответ написан
    Комментировать
  • Как "распаковать" параметры из переменной в bash-скрипте?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Юзай eval, он раскроет все переменные и выполнит команду.

    $ excludes=".cache,.config/google-chrome,Загрузки"
    $ eval echo -sh ~ --exclude=$HOME/{$excludes}
    -sh /home/saboteur --exclude=/home/saboteur/.cache --exclude=/home/saboteur/.config/google-chrome --exclude=/home/saboteur/Загрузки
    Ответ написан
    1 комментарий
  • Ошибка в скрипте backup?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    TIMESTAMP='data +"%Y-%m-%d_%H-%M-%S"'

    У вас тут кавычки неправильные. Одинарные кавычки - это просто текст. Обратные одинарные кавычки - это command substitution (то, что вы хотели сделать)
    Но лучше использовать $() конструкцию:
    TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")

    p.s. и да, у вас data вместо date
    Ответ написан
    4 комментария
  • Как сделать вхождение по TAB в терминале linux?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    bash completion - это большая библиотека функций, которые по tab умеют дополнять
    * имена алиасов
    * имена функций
    * имена переменных
    * названия команд
    * пути файловой системы
    * опции для некоторых команд.

    Можно почитать документацию, как добавить дополнение для вашей собственной команд - https://www.gnu.org/software/bash/manual/html_node...
    Ответ написан
    Комментировать
  • Как скопировать текст из одного файла и вставить в 5 строку 14 позицию?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Не совсем понятно что такое в 14 позицию. Но может быть вам нужно это?
    read LINE <1.txt
    sed -r -i "5s/(.{13})(.*)/\1\$LINE\2/" 2.txt
    Ответ написан
    Комментировать
  • Как исправить ошибку unexpected EOF while looking for matching `"'?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    1. Написано, что ошибка в строке 42-43, а на картинке от силы 20 строк. Ты весь скрипт просмотри, где кавычку не закрыл.
    2. Выкладывать надо текст, а не картинку.
    Ответ написан
    5 комментариев
  • Как создать массив с ведущими нулями в Bash?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Не существует такого понятия, как "число с ведущим нулем".
    Ведущий ноль это не часть числа а просто форматирование вывода.
    Поэтому просто пользуйтесь printf с указанием формата, в вашем случае %02d (d - число, 02 - 2 цифры с ведущим нулем)
    #!/bin/bash
    
    hr=(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23)
    
    for i in ${hr[@]}; do
    printf "%02d\n" ${hr[i]}
    done
    Ответ написан
    Комментировать