Почему сброс первого элемента массива в bash уничтожает все это? - PullRequest
0 голосов
/ 17 декабря 2018

Некоторое время назад я создал скрипт для обработки некоторых ежедневных данных в течение нескольких недель, месяцев или даже лет.Единственное, что мне нужно было сделать, это отбросить первый элемент, или я получу дубликат записи в результате.Этот сценарий творит чудеса.Перемотав несколько месяцев, мне нужно было создать идентичный скрипт, который отличается вызовом определенных двоичных файлов и скриптов для обработки данных.Я скопировал скрипт и внес соответствующие изменения, оставив генерацию последовательности дат и отбрасывая первый элемент как есть.Когда я запускаю этот новый скрипт, весь массив дат сбрасывается при вызове unset для первого элемента.

Вот скрипт:

#!/bin/sh

if [ "$1" = '' ] || [ "$3" = '' ]; then
    echo -e "Uso:\t$0 <estacion> <inicio> <fin>"
    echo
    echo -e "\tEl argumento 'estacion' es el identificador de una de las estaciones en"
    echo    "maysculas (e.g. RMA1_FDC). Los otros dos--'inicio' y 'fin'--son fechas de la"
    echo    "forma AAAA-[M]M-[D]D, dondeA corresponde a un digito del año, M para el mes, y D"
    echo    "para el dia. Notese que el mes y el dia solo requieren un digito si el valor"
    echo    "para este campo es menor a diez. No es necesario poner '0' adelante del numero"
    echo    "en este caso."
    echo
    echo    "Este programa genera datos en formato CSV (coma separated values) en la salida"
    echo    "estandar. Si desea guardarlos a un archivo, redirija la salida al mismo. Ej."
    echo
    echo    "$0 RMA1_FDC 2018-7-1 2018-12-10 > registro.csv"
    echo

    exit -1
fi

PRECIPITACION_MODELO=2
PRECIPITACION_ESTACION=5
DIA_A=$2
FECHAS=$(seq $(date +%s -d $2) 86400 $(date +%s -d $3))
>&2 echo "Fechas = "${FECHAS[*]}
unset -v FECHAS[0]
>&2 echo "Fechas = "${FECHAS[*]}

echo "fecha,'delta precipitacion',corrida"

for d in ${FECHAS[@]}; do
    DIA_B=$(date +%Y-%-m-%-d -d @$d)
    >&2 echo "$DIA_A -- $DIA_B"
    ./getstationdata  $1 $DIA_A $DIA_B $PRECIPITACION_ESTACION > estacion 2> /dev/null

    ./getwrfdata  $1 $DIA_A $DIA_B $PRECIPITACION_MODELO A > pronostico 2> /dev/null
    echo -n "$DIA_A,"
    ./delta-precipitacion 2> /dev/null | awk 'ORS=NR%3?" ":"\n"' | awk '{print $2 ",A"}'

    ./getwrfdata  $1 $DIA_A $DIA_B $PRECIPITACION_MODELO B > pronostico 2> /dev/null
    echo -n "$DIA_A,"
    ./delta-precipitacion 2> /dev/null | awk 'ORS=NR%3?" ":"\n"' | awk '{print $2 ",B"}'

    ./getwrfdata  $1 $DIA_A $DIA_B $PRECIPITACION_MODELO C > pronostico 2> /dev/null
    echo -n "$DIA_A,"
    ./delta-precipitacion 2> /dev/null | awk 'ORS=NR%3?" ":"\n"' | awk '{print $2 ",C"}'

    ./getwrfdata  $1 $DIA_A $DIA_B $PRECIPITACION_MODELO D > pronostico 2> /dev/null
    echo -n "$DIA_A,"
    ./delta-precipitacion 2> /dev/null | awk 'ORS=NR%3?" ":"\n"' | awk '{print $2 ",D"}'

    DIA_A=$DIA_B;
    DIA_B=$(date +%Y-%-m-%-d -d @$d)
done

rm -f estacion pronostico

Обратите внимание на часть, где написано

>&2 echo "Fechas = "${FECHAS[*]}
unset -v FECHAS[0]
>&2 echo "Fechas = "${FECHAS[*]}

Я получаю серию чисел, представляющих даты для первого 'echo', но простое "FECHAS =" и ничего после этого для второго.Я был озадачен этим уже неделю.Кто-нибудь знает, что с ним не так?

1 Ответ

0 голосов
/ 17 декабря 2018

Вот более простой способ воспроизвести вашу проблему:

var="foo bar"
echo "The value is: ${var[*]}"
unset -v 'var[0]'
echo "The value is now: ${var[*]}"

Это выводит:

The value is: foo bar
The value is now:

Это происходит потому, что переменная не является массивом , этотолько этот bash позволяет вам рассматривать вашу обычную переменную как массив с одним значением с индексом 0:

var="foo bar"
echo "No index = $var"
echo "[0] = ${var[0]}"
echo "[1] = ${var[1]}"

Выходы:

No index = foo bar
[0] = foo bar
[1] =

Если вы создаете фактический массив с var=("foo" "bar")в приведенных выше примерах вы получите ожидаемый результат:

No index = foo
[0] = foo
[1] = bar
The value is: foo bar
The value is now: bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...