if ! grep -Evq 'accepting|idle' /tmp/lpstat-Final.log; then
status=0
statustxt=OK
else
echo 'Something found'
fi
Lo principal aquí es que grep
no producirá ningún resultado si usa -q
. Esto significa que usar una sustitución de comando no capturará nada($logcheck
en su código estará vacío ). En cambio, usamos el estado de salida de la utilidad para determinar si se encontró algo o no.
Estoy usando -E
aquí para hacer que la expresión regular sea más bonita; también es necesario para la alternancia (la alteración con \|
en una expresión regular básica es una extensión, respaldada por, p. GNgrep
).
Оболочка bash
может хранить отдельные строки в одиночных обычных переменных, списки строк в массивах и строки, связанные с другими строками в ассоциативных массивах. Вы не сможете хранить, например. массивы массивов или ассоциативные массивы ассоциативных массивов (или их комбинации ).
Для конкретных данных, которые вы упомянули, вы могли бы сделать что-то вроде ассоциативного массива:
declare -A goals
goals["teamA"]="0:2:3:4"
goals["teamB"]="1:3:3:3"
# etc.
или
declare -A goals
goals=(
["teamA"]="0:2:3:4"
["teamB"]="1:3:3:3"
# etc.
)
, а затем анализировать:
-значения с разделителями, когда они вам понадобятся:
for team in "${!goals[@]}"; do
home_goals=$( cut -d : -f1 <<<"${goals[$team]}" )
away_goals=$( cut -d : -f2 <<<"${goals[$team]}" )
# etc.
# use "$team", "$home_goals", "$away_goals" etc. here
done
... но было бы намного эффективнее сделать это на таком языке, как Perl или Python, который допускает произвольное вложение структур данных.
Например, в Perl:
my %goals = ( "teamA" => [ 0, 2, 3, 4 ],
"teamB" => [ 1, 3, 3, 3 ],
# etc.
);
Известные мне оболочки плохо справляются со структурными данными, поскольку у них нет вложенных структур данных. (Это включает Bash, который вы отметили. )Вам нужен список объектов или структур в стиле C -, но все, что у вас может быть, это массивы и ассоциативные массивы.
Один из способов сделать это — создать отдельные ассоциативные массивы для каждой части данных, которые у вас есть (забитые голы, пропущенные голы... )и пометить массивы названиями команд.
Так, например.
declare -A goals_scored goals_conceded
goals_scored[Liverpool]=4
goals_conceded[Liverpool]=2
goals_scored[Tottenham]=3
goals_conceded[Tottenham]=3
for team in "${!goals_scored[@]}"; do # iterate over the keys of goals_scored
echo "$team has scored ${goals_scored[$team]} goals"
done
Это несколько уродливо, так как элементы данных находятся на верхнем уровне, и если бы у вас также были структуры, например, для. игроков, они начнут путаться. (Например, goals_scored
может относиться к команде или игроку, так что вам придется как-то их разделить.)
Вероятно, было бы лучше использовать правильный язык программирования.
См. Массивы/ассоциативные массивы в BashGuide для получения дополнительной информации об ассоциативных массивах.
Вы можете сделать это в ksh93
с составными переменными:
ksh93$ typeset -A teams
ksh93$ teams[A]=(scored=(home=3 away=7) conceded=(home=1 away=0))
ksh93$ teams[B]=(scored=(home=2 away=0) conceded=(home=3 away=1))
ksh93$ echo ${teams[A].conceded}
( away=0 home=1 )
ksh93$ echo ${teams[A].conceded.away}
0
ksh93$ teams[A].conceded.away=1
К сожалению, они не автооживляются с нуля, как это делают хэши вperl
:
ksh93$ foo.bar.baz=quux
ksh93: foo.bar.baz=quux: no parent
ksh93$ foo=() # or typeset -C foo
ksh93$ foo.bar.baz=quux
ksh93$ typeset -p foo
typeset -C foo=(bar=(baz=quux))