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

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Примерно так:
    sed ':a;N;$!ba;s/""/"world"/2'

    , где двоеточие - определение метки с именем a;
    N - добавить новую строку к pattern space;
    $ - к последней строке;
    ! - применить;
    b - переход к метке, в данном случае к метке a;
    s - поиск и замена;
    /""/ - что ищем, в данном случае пустые кавычки;
    "world" - на что заменить найденное совпадение, в данном случае на "world";
    /2 - замена второго совпадения.

    echo "hello: \"\"
    hello: \"\"
    hello: \"\"" | sed ':a;N;$!ba;s/""/"world"/2'

    Еще можно такой вариант попробовать:

    sed '2s/""/"world"/1'
    Ответ написан
    4 комментария
  • Как получить все каталоги в массив и пройтись по ним аналогом foreach?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Можно использовать find:
    find /etc/* | while read -r path; do 
      if [[ -f "$path" ]]; then 
        printf "Файл: %s\n" "$path"; 
      elif [[ -d "$path" ]]; then
        printf "Мамка: %s\n" "$path"; 
      fi
    done

    /etc/* - путь поиска. В данном случае будут получены все файлы и папки каталога /etc.

    При помощи дополнительных параметров, можно ограничить выборку.
    Например, ограничиться текущим уровнем: -maxdepth 0.
    Найти только каталоги: -type d.
    Или только файлы: -type f.
    find /etc/* -maxdepth 0 | while read -r path; do 
      if [[ -f "$path" ]]; then 
        printf "Файл: %s\n" "$path"; 
      elif [[ -d "$path" ]]; then
        printf "Папка: %s\n" "$path"; 
      fi
    done

    Для получения подробностей см. find --help.

    Если все еще нужен будет массив, то можно сформировать в цикле:
    declare -a files
    
    find /etc/* -maxdepth 0 -type f | while read -r path; do
      files+=("$path")
    done
    Ответ написан
  • Как убрать символ переноса строки?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Пропустить через trim.

    $command_script = "create_first_file.sh $this->server_user_name " .
                      trim($id_app) . " index$type_ex_file";


    Откуда берется лишний перевод строки, сказать сложно. Нужно в живую смотреть :-) Не припомню подобного поведения с формами в PHP. Может проблема во входящих данных ($data->id). Кстати, точка с запятой там лишняя, достаточно: <?=$data->id?>.

    Или же данные меняются где-то между отправкой и передачей в $id_app.

    Точки останова можно расставить и посмотреть, что происходит.
    Ответ написан
    2 комментария
  • Стоит ли учиться писать скрипты на bash?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Конечно стоит изучать bash. В системах Linux многое на нем сделано, так что в любом случае придется с ним сталкиваться.

    Я не учил bash намеренно. В какой-то момент просто взял и начал на нем писать код :-) Могу сказать, что язык ужасный, привередливый, местами крайне неудобный, перенасыщен подводными камнями (точнее морским ежами и минами). Но в то же время bash достаточно мощный язык.

    Для небольших скриптов будет проще использовать bash. Для чего-то сложного лучше использовать нормальный язык программирования.

    Для понимания основ будет достаточно хороших знаний и опыта работы с любым другим языком программирования; это поможет задавать правильные вопросы и быстро находить ответы.

    В основе идеологии Unix-подобных систем лежит простота. Так что с чем-то сложным скорее всего придется сталкиваться редко. Знаний программирования или даже основ программирования, должно вполне хватить для понимания скриптов bash, с которыми придется сталкиваться. Но пару недель его хорошенько поковырять, лишним не будет, главное мотивацию найти.
    Ответ написан
    Комментировать