Расширение составной подстроки в Bash [дубликат]

Не зная больше о том, чего вы пытаетесь достичь, похоже, что ваши "начальные" сценарии оболочки никогда не возвращаются (возможно, они запускают , но оставьте его на переднем плане). Если это так, вы можете вместо этого искать , который запустит два сценария в фоновом режиме:

startWebLogic.sh &
startNodeManager.sh &

Обратите внимание, однако, что с добавленными амперсандами ваш сценарий будет завершиться сразу после запуск двух «стартовых» сценариев оболочки. Вы можете использовать подходящего менеджера служб, если вам нужен более точный контроль.

1
21.07.2018, 07:05
3 ответа

Вы не можете выполнить вложенную замену с переменной в крайней левой части . Таким образом, вы можете делать ${foo#$bar}, но не то, что вы показываете.

Поместите результат подстановки в переменную, если хотите использовать ее в дальнейших подстановках.

2
27.01.2020, 23:18

Подстановка параметра не может воздействовать на результат подстановки другого параметра без предварительного сохранения исходного результата в переменной и применения к ней второй подстановки.

Вы также зацикливаете вывод find, что не рекомендуется .

Правильный способ обеспечить цикл с результатом find— это вызвать дочернюю оболочку и выполнить цикл там:

find. -type f -iname '*_??????????.pdf' -mtime -1 -exec sh -c '
    for pathname do
        timestamp=${pathname##*_}   # remove up to last _
        timestamp=${timestamp%.pdf} # remove.pdf
        printf "pathname=%s\ttimestamp=%s\n" "$pathname" "$timestamp"
    done' sh {} +

Таким образом, вам не нужно беспокоиться о реальных путях. Имена файлов (, т. е. имена файлов и каталогов, а также другие типы файлов )в Unix могут содержать любой символ, кроме /и \0, например пробел и новую строку. Используя подстановку команд в find, вы заставляете оболочку, во-первых, выполнять разбиение слов (по умолчанию на пробелы, табуляции и новые строки ), а во-вторых, выполнять генерацию имен файлов на основе шаблонов, найденных в путях, возвращенных из find. Таким образом, ваш исходный цикл может оказаться зацикленным на совсем других словах, чем вы ожидали.

Связанные:

2
27.01.2020, 23:18

Если я правильно понимаю, проблема использования Awk заключается в том, что вы вызываете один процесс Awk для каждого файла PDF (Я предполагаю, что у вас есть ОГРОМНОЕ количество таких ).

Вы можете запустить что-то вроде

find....... -print0 | perl -0nE '/.*_(\d{10}).pdf/ and say "$1.pdf"'

Или если вы соблюдаете структуру:

for file in $(find.....| perl....)
do 
 ...
done

(и, конечно же, замените команду Perl любым эквивалентом Awk, sed, Python)

(Если у вас есть возможность попробовать этот подход, расскажите нам о time....полученном)

0
27.01.2020, 23:18

Теги

Похожие вопросы