Могу ли я назначить несколько записей данных одной переменной, и если да, то как?

if ! grep -Evq 'accepting|idle' /tmp/lpstat-Final.log; then
    status=0
    statustxt=OK
else
    echo 'Something found'
fi

Lo principal aquí es que grepno producirá ningún resultado si usa -q. Esto significa que usar una sustitución de comando no capturará nada($logchecken 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 -Eaquí 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).

0
08.05.2019, 01:47
3 ответа

Оболочка 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.
            );
1
28.01.2020, 02:30

Известные мне оболочки плохо справляются со структурными данными, поскольку у них нет вложенных структур данных. (Это включает 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 для получения дополнительной информации об ассоциативных массивах.

1
28.01.2020, 02:30

Вы можете сделать это в 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))
0
28.01.2020, 02:30

Теги

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