Это немного сложно сделать с sed
. Однако вот закомментированное предложение, которое работает с GNU sed:
parse.sed
s|([^ ]+).*/([^/]+)/.*| "\2" : \1,| # Extract size and name in json-format
1h; 1!H # Correctly add them to hold-space
$ {
z # Clear pattern-space
s/^/\{/ # Prepend start-curly-brace
G # Fetch formatted json from hold-space
s/,$// # Remove last comma
s/$/\n\}/ # Append end-curly-brace
p # Print
}
Запустите это так:
du -shm /var/vmail/mailboxes/domain/*/mail | sed -Enf parse.sed
Или в виде одного -вкладыша:
du -shm /var/vmail/mailboxes/domain/*/mail |
sed -Ene 's|([^ ]+).*/([^/]+)/.*| "\2" : \1,|;1h;1!H;${z;s/^/\{/;G;s/,$//;s/$/\n\}/;p}'
Выход в обоих случаях:
{
"USER1" : 80,
"USER2" : 150,
"USER3" : 220
}
Что такое сценарий оболочки, кроме файла, содержащего команды оболочки? Вы можете притвориться, что это не сценарий оболочки и поместить его в одну строку с чем-то вроде:
(test; r=$?; report; [ "$r" -gt 0 ] && exit 1; exit 0)
Это завершает подоболочку с 1
, если первая команда вернула что-либо, кроме 0
; в противном случае возвращается 0
.
Для примера --Я просто повторяю что-то вместо запуска реальной программы:
$ (false; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
report
$ echo $?
1
$ (true; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
report
$ echo $?
0
$ # example with an exit-status of 2:
$ (grep foo bar; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
grep: bar: No such file or directory
report
$ echo $?
1
Если вы регулярно устанавливаете параметр оболочки errexit
,вы хотите добавить переопределение, чтобы подоболочка не закрывалась преждевременно:
(set +o errexit; false; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
Сохранение и повторное использование $?
.
test; ret=$?; report; exit $ret
Если у вас есть несколько тестовых команд и вы хотите запустить их все, но следите за тем, не сработала ли одна из них, вы можете использовать ловушку ERR в bash.
failures=0
trap 'failures=$((failures+1))' ERR
test1
test2
if ((failures == 0)); then
echo "Success"
else
echo "$failures failures"
exit 1
fi
Вы сказали "выйти из состояния 1, если команда test
не удалась". Предполагая, что вы намеревались сделать это различие (, то есть вы хотите, чтобы значение выхода было 1, даже если команда test
завершается, скажем, 2 или 3 или что-то еще ), тогда это достойное решение:
test && { report; true; } || { report; false; }
Если вы на самом деле не имели в виду «1», но все, что не -ноль, с которым test
завершилось, было бы в порядке в качестве вашего общего кода выхода, тогда текущий верхний ответ (сохранить и повторно использовать $? )работает нормально.
Очень плохая идея, но, похоже, она работает, для вдохновения:
(trap report exit; test)