Estoy trabajando en un script de shell para trabajar con sqlplus (oracle), en la parte del código a continuación:

#!/usr/bin/bash

################ Checking tables ###################
TABLES=$(sqlplus -s  ${DBUSER}/${DBPASS}@${DBHOST} <<EOF
...
EOF
)

SuccessTabs=$TABLES

########## Export data from tables to file #########
for TABLE in $TABLES
do
echo "--- Processing $TABLE ---" >> $Log
FILE=$TABLE.csv
TotFiles=$TotFiles$FILE" " -------------------------> (1) Not understand this line ?
sqlplus -s  ${DBUSER}/${DBPASS}@${DBHOST} <<EOF
...
SPOOL $FILE
Select ... FROM $TABLE;
SPOOL OFF
EXIT
EOF

return=$?
if [ $return != 0 ]
then
SuccessTabs=({$SuccessTabs[@]/$TABLE}) -------------> (2) Not understand this line ?
else
echo "--- $TABLE.csv process success ---" >> $Log
fi
done
echo "--- Process all tables success --- " >> $Log
echo "$SuccessTabs " >> $Log
FinalFile=FINAL_"_"${rundate}_${logtime}".csv"
echo "--- Merge all files into $FinalFile ---" >> $Log
cat $TotFiles > $FinalFile

La pregunta es que tengo dos líneas de comando, incluso sé literalmente lo que se usa para imprimir el resultado, pero aún no entiendo cuál es su sintaxis y mecanismo.

(1) TotFiles=$TotFiles$FILE" " ¿para qué se usan las comillas dobles con espacio al final y por qué una sintaxis como esta?

(2) SuccessTabs=({$SuccessTabs[@]/$TABLE}) ¿Qué es [], @, / se combinan para usar en este comando y por qué una sintaxis como esta, especialmente para [@], ¿Quiere saber qué es esto?

¿Alguien podría ayudarme a averiguarlo? Gracias.

2
Lampard 13 dic. 2016 a las 06:32

2 respuestas

La mejor respuesta

Hablemos de [@] primero. En bash puedes declarar una matriz así:

declare -a testarray=('box' 'cat' 'dog')

Puede hacer eco del contenido de testarray haciendo esto:

echo ${testarray[@]}

Resultado: box cat dog

Ahora, veamos un comportamiento interesante:

echo ${testarray[@]/dog}
box cat

¿Ves lo que pasó aquí? Encuentra un perro y reemplázalo por nada. Mira esto:

echo ${testarray[@]/dog/pig}
box cat pig

Eso reemplazó al perro con el cerdo.

Entonces, la respuesta a su segunda pregunta es que si la matriz SuccessTabs contiene el mismo texto que en $TABLE, ese texto se reemplaza con nada. El resultado se vuelve a asignar a la variable SuccessTabs.


Entonces, ¿qué está haciendo TotFiles=$TotFiles$FILE" "? Tomando el mismo ejemplo de matriz de prueba, repasemos todos sus valores.

$ declare -a testarray=('box' 'cat' 'dog')
$ for item in ${testarray[@]}; do
>     testvar=$testvar$item".."
>     echo $testvar
> done
box..
box..cat..
box..cat..dog..

Entonces, en el primer ciclo, $testvar no es nada. $item es box. $testvar$item".." es box... Este valor se asigna a la variable testvar.

En el segundo ciclo, $testvar es box... $item es cat. $testvar$item".." es box..cat... Este valor se asigna a la variable testvar.

En el tercer ciclo, $testvar es box..cat... $item es dog. $testvar$item".." es box..cat..dog... Este valor se asigna a la variable testvar.

De manera similar, si TABLES es una lista / matriz que contiene box cat dog, $ FILE será box.csv, cat.csv y dog.csv durante cada iteración de TABLES. TotFiles=$TotFiles$FILE" " se convertirá en box.csv cat.csv dog.csv.

Vea más ejemplos en dos lugares:

Mis ejemplos anteriores pueden tener imprecisiones. El objetivo era darte un ejemplo de cómo obtener la información que estabas buscando.

4
zedfoxus 13 dic. 2016 a las 04:30
TotFiles=$TotFiles$FILE" "

Agrega a TotFiles, el contenido de FILE y un espacio (es por eso que tiene " ") a TotFiles existente. Sugeriría escribir esto como

TotFiles="${TotFiles}${file} "  # It's not suggested to use UpperCase letters for user variables

Respecto a

SuccessTabs=({$SuccessTabs[@]/$TABLE})

No tiene mucho sentido para mí a menos que hayas declarado SuccessTabs como una matriz. Tenga en cuenta que si tiene

declare -a var=( array...stuff )
var=( ${var[@]/STUFF_TO_OMIT} ) #omits the `STUFF_TO_OMIT` from the array, ie it gives you everything except `STUFF_TO_OMIT`

Si eso es lo que pretendía hacer, entonces necesita cambiar

SuccessTabs=({$SuccessTabs[@]/$TABLE})

Para

SuccessTabs=( ${SuccessTabs[@]/$TABLE} ) # See how curly brackets are placed, again not a good idea using uppercase variables !
0
sjsam 13 dic. 2016 a las 04:44