Вы можете зациклить команду
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
.
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 -, например ).