Ответ Гленна - это хороший - различие между (...)
и {...}
важно.
Одна стратегия, которую я часто использую для вывода ошибок, как то, что в вашем вопросе, это команда Tee
. Вы можете сделать что-то подобное:
echo "Normal output"
{
printf "[%s] %s\n" "$(date '+%Y-%m-%d %T')" "Warning text"
printf "[%s] %s\n" "$(date '+%Y-%m-%d %T')" "This event is logged."
} | tee -a $logfile >&2
echo "More normal output"
Команда Tee
отправит вывод в два места; -A
Опция «Добавляет» вывод в именованный файл, и команда также будет передавать ввод на stdout. > & 2
> & 2 в конце линейного перенаправления STEE
STDOUT для STDERR, которая может обрабатываться по-разному (то есть в работе CRON).
Еще один совет, который я часто использую в сценариях Shell, состоит в том, чтобы изменить поведение отладочной или элбозной вывода на основе того, работает ли скрипт на терминале или имеет вариант -V
. Например:
#!/bin/sh
# Set defaults
if [ -t 0 ]; then
Verbose=true; vflag="-v"
else
Verbose=false; vflag=""
fi
Debug=false; AskYN=true; Doit=true
# Detect options (altering defaults)
while getopts vdqbn opt; do
case "$opt" in
v) Verbose=true; vflag="-v" ;; # Verbose mode
d) Debug=true; Verbose=true; vflag="-v" ;; # Very Verbose
q) Verbose=false; vflag="" ;; # quiet mode (non-verbose)
b) AskYN=false ;; # batch mode
n) Doit=false ;; # test mode
*) usage; exit 1 ;;
esac
done
# Shift our options for further processing
shift $(($OPTIND - 1))
$Verbose && echo "INFO: Verbose output is turned on." >&2
$Debug && echo "INFO: In fact, expect to be overrun." >&2
# Do your thing here
if $AskYN; then
read -p "Continue? " choice
case "$choice" in
Y|y) $Doit && somecommand ;;
*) echo "Done." ;;
esac
fi
Сценарии могут начать с чего-то общего, подобного этому на вершине, с Verbose и Debug Explay, разброшенные по всему скрипту. Это просто один способ сделать это - есть много, и разные люди будут иметь свой способ справиться с этим, особенно если они были примерно в то время как. :)
еще один вариант - обрабатывать свой вывод с помощью «обработчика» - функция оболочки, которые могут сделать более умные вещи. Например:
#!/bin/bash
logme() {
case "${1^^}" in
[IN]*) level=notice ;;
W*) level=warning ;;
A*) level=alert ;;
E*) level=emerg ;;
*) level=notice ;;
esac
if [[ "$#" -eq 1 ]]; then
# Strip off unnecessary prefixes like "INFO:"
string="${1#+([A-Z])?(:) }"
else
shift
string="$@"
fi
logger -p "${facility}.${level}" -t "$(hostname -s)" "$string"
}
echo "Normal output"
logme INFO "Here we go..."
somecommand | logme
echo "Additional normal output"
(Обратите внимание, что $ {var ^^}
- это только Bash.)
Это создает функцию оболочки, которая может использовать функции функций
Команда Vogger
) Для отправки вещей в системные журналы. Функция
функций logme () может использоваться либо с параметрами, которые генерируют отдельные строки данных журнала, либо с несколькими строками ввода, которые обрабатываются на stdin. Играйте с этим, если кажется привлекательным.
Обратите внимание, что это пример и, вероятно, не должен быть скопирован дословно, если вы не понимаете его и не знаете, что это делает именно то, что вам нужно. Лучшая идея состоит в том, чтобы взять концепции здесь и внести их сами в своих собственных сценариях.
Я не уверен, что это ваше требование, но от того, что я вывод ниже, кажется, то, что вам требуется:
awk -v var="$c" '{if (NR < 15 && $8 >0.48 && $8 <0.52 && $9 >0.48 && $9 <0.52 && $10 >0.48 && $10 <0.52) {print var ":" $1 " " $8 " " $9 " " $10}}' RD00$c/MergerHalos.out >> center_raw.dat
-V
опция awk
используется для передачи значения внешнего переменной Bash внутри awk.
Быстрый переписать стилистически (более сухой)
for (( c=sta; c<=end; c++ )); do
awk -v c=$c '
NR == 15 {exit}
function ok(val) {return (0.48 < val && val < 0.52)}
ok($8) && ok($9) && ok($10) {print c, $1, $8, $9, $10}
' RD00$c/MergerHalos.out
done >> center_raw.dat
Вы могли бы сделать все это в awk, я думаю
awk '
function readfile(i){
file="RD00"i"/MergerHalos.out"
while ( (getline < file) > 0) {
if(NR < 15 && $8 >0.48 && $8 <0.52 && $9 >0.48 && $9 <0.52 && $10 >0.48 && $10 <0.52)
print i":"$1,$8,$9,$10 > center_raw.dat
}
close(file)
}
BEGIN{
sta=ARGV[1]
end=ARGV[2]
ARGC=0
while(end>sta){print end;readfile(end--)}
}' $start $end
Я думаю, что это может быть излишек, хотя