Установка подробного параметра для команд at (1 )и пакета (1 )

Вы можете зациклить команду

sed -n '23s/[^0-9]*\([0-9]*\)[^0-9]*/\1+1000/p' \
b2bsoapinput.xml | bc | xargs -I{} sed -i \
'23s/\([^0-9]*\)[0-9]*\([^0-9]*\)/\1{}\2/g' b2bsoapinput.xml

Чтобы можно было бежать

for i in {1..25}; do
    curl -H "text/xml" --data-binary \
    "@/home/miracle/email/b2bsoapinput.xml" \
    https://x.x.x.x:5550 --insecure -u admin:xxxxx \
    >> somaoutput$i.xml || break
    sed -n '23s/[^0-9]*\([0-9]*\)[^0-9]*/\1+1000/p' 
    b2bsoapinput.xml | bc | xargs -I{} \
    sed -i '23s/\([^0-9]*\)[0-9]*\([^0-9]*\)/\1{}\2/g' \
    b2bsoapinput.xml
done

Первый sedсоответствует единственному числу в строке 23 и заменяет его на number+1000. .../pговорит sed печатать замененное значение, а -nговорит ему не печатать измененный файл. Следовательно, в bcпередается только заменяющая строка, выполняющая арифметику. Второй sed заменяет единственное число в строке 23 новым значением и изменяет файл на месте. Я использовал xargs, чтобы поместить передаваемое значение в аргумент sed. -I{}устанавливает строку, которая заменяется передаваемым значением, на {}.

Редактировать:Я добавил || breakв петлю. Это приводит к «остановке» цикла, если команда предварительного заполнения не удалась (, возвращает код выхода, отличный от 0 ), и программа продолжает работу после завершения цикла. Однако, если curl завершается с 0, даже когда он получает ответ об ошибке, вам нужно вызвать breakпо другому условию. Может быть, что-то вроде grep "an error text" somaoutput$i.xml && break.

Если вы хотите, чтобы ваша программа продолжалась со следующей итерации цикла, а не после него, вы можете использовать continueвместо break.

2
13.07.2020, 19:14
1 ответ

sh_in_stdinне является onпри интерпретации ~/.zshenvили при интерпретации любого исходного файла (в этих случаях шелл-код не исходит из stdin ). Вы можете проверить это, добавив echo $options[shinstdin]к своему ~/.zshenvили запустив:

$ echo 'echo $options[shinstdin]; source =(<<<"echo \$options[shinstdin]")' | zsh
on
off

Вместо этого вы можете проверить, что $PPIDработаетatd:

if [[ $(ps -o comm= -p $PPID) = atd ]]; then...

Лично мне не нравится идея делать это безоговорочно для каждого zshзапуска из atd.

Всегда можно определить debug-atкоманду, которая выполняет:

debug-at() {
  {
    echo 'PS4="> "; set -o verbose -o xtrace'
    cat
  } | at "$@"
}

И используйте это вместо at, если вы хотите, чтобы задание at/ batchвыполнялось с включенной отладкой.

Имейте в виду, что не все системы используют $SHELLдля интерпретации предоставленного кода. В Debian atнет. POSIX оставляет реализацию -определенной . Приведенный выше подход будет работать независимо от используемой оболочки (, если это Korn/POSIX -, например ).

2
18.03.2021, 23:20

Теги

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