Script para generar números de serie consecutivos [solucionado]

Imagen de Tholraa
0 puntos

Estoy intentado hacer un script que me premita crear números de serie consecutivos para un proyecto diferente; el número inicial lo toma de un archivo que existe en la misma ruta y se llama Contador.txt y los numeros generados los envía a distintos ficheros dependiendo de que tipo sean.

El código que hasta ahora he escrito es el siguiente:

#!/bin/bash

# José Antonio Ariza

# El propósito de este script es generar un fichero
# de texto plano con el tipo y nº de orden de los elementos
# heráldicos que se vayan creando bajo pedido.

# Pedimos el apellido del escudo usado
echo "Introduzca el linaje al que corresponde el gráfico (en mayúsculas)"
read Linaje

# Pedimos la cantidad de lineas a generar
echo "Indique el número de unidades a generar"
read Conta_uds

# Pedimos el tipo de trabajo que hemos realizado
echo "Selecciona el tipo de archivo de salida"
echo "1) Ex-Libri"
echo "2) Blasón unitario"
echo "3) Blasón doble"
echo "4) Certificado"
echo "5) Diploma"
read Valor1
case $Valor1 in
1) Inicio1="AHDA-EL-"
Fichero="EL"+(date +%Y%m%d)+".txt"
echo $Fichero
Ariza_Contador
;;
2) Inicio1="AHDA-BL-"
Fichero="BL"+(date +%Y%m%d)+".txt"
echo $Fichero
Ariza_Contador
;;
3) Inicio1="AHDA-B2-"
Fichero="B2"+(date +%Y%m%d)+".txt"
echo $Fichero
Ariza_Contador
;;
4) Inicio1="AHDA-CE-"
Fichero="EL"+(date +%Y%m%d)+".txt"
echo $Fichero
Ariza_Contador
;;
5) Inicio1="AHDA-DI-"
Fichero="EL"+(date +%Y%m%d)+".txt"
echo $Fichero
Ariza_Contador
;;
*) echo "Ha pulsado una tecla o combinación de teclas no aceptada"
echo "por favor, pulse un número del 1 al 5"
;;
esac
# Creamos la función Ariza_GenContador, con la que generamos el número
# de serie del gráfico encargado y la enviamos a un fichero de texto
# desde el que será leído por glabel
function Ariza_Contador() {

Conta_inicio=cat Contador.txt
Total_uds=$Conta_inicio+$Conta_uds
for Contador in (seq $Conta_inicio $Total_uds)
do
Salida=$Inicio1+$Contador+$Linaje
echo $Salida >> $Fichero
done
echo $Total_uds > Contador.txt
}

El problema que se me plantea es que tras la introducción de $Valor1 aborta la ejecución del script; espero que podáis ayudarme...

Imagen de JAVIER NAVARRO ALTIMIRA
+1
+1
-1

#!/bin/bash
#
# Esto es una variación del script la salida generada
# la salida siguiente se deposito en un archivo llamado
# BL20121024.txt respondiendo a la pregunta Linaje con
# TRASTAMARA y con 10 al número de unidades a generar
#
# AHDA-BL-40TRASTAMARA
# AHDA-BL-41TRASTAMARA
# AHDA-BL-42TRASTAMARA
# AHDA-BL-43TRASTAMARA
# AHDA-BL-44TRASTAMARA
# AHDA-BL-45TRASTAMARA
# AHDA-BL-46TRASTAMARA
# AHDA-BL-47TRASTAMARA
# AHDA-BL-48TRASTAMARA
# AHDA-BL-49TRASTAMARA
# AHDA-BL-50TRASTAMARA
#
# Para ejecutar un comando encerrarlo entre comillas sencillas invertidas
# por ejemplo para una secuencia de números
# for n in `seq 1 10`
# do
# ....lo que se quiera hacer con la serie $n
# done
#
# José Antonio Ariza

# estas variables son globales
Conta_uds=0
Linaje=""

# Esta función tiene que estar al inicio del script
# Creamos la función Ariza_GenContador, con la que generamos el número
# de serie del gráfico encargado y la enviamos a un fichero de texto
# desde el que será leído por glabel
function Ariza_Contador() {

Conta_inicio=`cat Contador.txt`
Total_uds=`expr $Conta_inicio + $Conta_uds`
for Contador in `seq $Conta_inicio $Total_uds`
do
#esta salida se puede formatear asi
# esta es la original: Salida=$Inicio1+$Contador+$Linaje
Salida=`printf "%s" $Inicio1``printf "%02d" $Contador``printf "%s" $Linaje`
#Salida=$Inicio1+$Contador+$Linaje
echo $Salida >> $Fichero
done
echo $Total_uds > Contador.txt
}

# El propósito de este script es generar un fichero
# de texto plano con el tipo y nº de orden de los elementos
# heráldicos que se vayan creando bajo pedido.

# Pedimos el apellido del escudo usado
echo "Introduzca el linaje al que corresponde el gráfico (en mayúsculas)"
read Linaje

# Pedimos la cantidad de lineas a generar
echo "Indique el número de unidades a generar"
read Conta_uds

# Pedimos el tipo de trabajo que hemos realizado
echo "Selecciona el tipo de archivo de salida"
echo "1) Ex-Libri"
echo "2) Blasón unitario"
echo "3) Blasón doble"
echo "4) Certificado"
echo "5) Diploma"
read Valor1
case $Valor1 in
1) Inicio1="AHDA-EL-"
Fichero="EL"`date +%Y%m%d`".txt"
echo $Fichero
Ariza_Contador
;;
2) Inicio1="AHDA-BL-"
Fichero="BL"`date +%Y%m%d`".txt"
echo $Fichero
Ariza_Contador
;;
3) Inicio1="AHDA-B2-"
Fichero="B2"`date +%Y%m%d`".txt"
echo $Fichero
Ariza_Contador
;;
4) Inicio1="AHDA-CE-"
Fichero="EL"`date +%Y%m%d`".txt"
echo $Fichero
Ariza_Contador
;;
5) Inicio1="AHDA-DI-"
Fichero="EL"`date +%Y%m%d`".txt"
echo $Fichero
Ariza_Contador
;;
*) echo "Ha pulsado una tecla o combinación de teclas no aceptada"
echo "por favor, pulse un número del 1 al 5"
;;
esac

+1
+1
-1
Imagen de Tholraa
+1
0
-1

Muchas gracias por la respuesta; ahora funciona a la perfección.
Aunque, una vez que con tu ayuda ya hace lo que yo deseaba, me pregunto si habrá alguna forma de dar un formato determinado a la variavle $Contador, de tal forma que contenga e imprima algo parecido a 00000001, de esta forma el tamaño del nº de serie no variará al ir aumentando.

De nuevo, muchas gracias; el hecho de recibir una respuesta y corrección del trabajo realizado es lo que distingue al mundo linux de la otra alternativa....

+1
0
-1
Imagen de JAVIER NAVARRO ALTIMIRA
+1
0
-1

Se puede formatear la salida de un número con el comando printf (que funciona igual que el comando printf del lenguaje C), por ejemplo, si una variable tiene el valor 34 se puede formatear de manera que tenga un ancho de 6 dígitos rellenados con ceros a la izquierda, un ejemplo seria un script bash como el que sigue, y el resultado tendria que ser el siguiente...
Valor sin formatear: 34
Valor formateado: 000034
Valor aumentado: 35
Pulsa enter para salir . . .

#!/bin/bash
clear
Contador=34
# esto imprimiria simplemente 34
echo "Valor sin formatear: $Contador"
# ahora se formatea el valor contenido en Contador almacenándolo en el mismo Contador
Contador=`printf "%06d" $Contador`
# ahora imprime el nuevo contenido de Contador
echo "Valor formateado: $Contador"
# Si ahora por cualquier causa tuvieses que aumentar el contador...
Contador=`expr $Contador + 1`
# ahora imprime el nuevo contenido de Contador aumentado
# se podria formatear otra vez si se necesitara
echo "Valor aumentado: $Contador"
echo -n "Pulsa enter para salir . . . " && read REPLY

+1
0
-1
Imagen de Tholraa
+1
0
-1

Después de la respuesta de JAVIER NAVARRO, la cual agradezco enormemente, he seguido trabajando sobre el script ya que me daba como resultado una unidad más de las pedidas inicialmente.
El resultado finalk es como sigue:

#!/bin/bash
#
#
# José Antonio Ariza
# El propósito de este script es generar un fichero
# de texto plano con el tipo y nº de orden de los elementos
# heráldicos que se vayan creando bajo pedido.

# estas variables son globales
Conta_uds=0
Linaje=""

# Esta función tiene que estar al inicio del script
# Creamos la función Ariza_GenContador, con la que generamos el número
# de serie del gráfico encargado y la enviamos a un fichero de texto
# desde el que será leído por glabel
function Ariza_Contador() {

Conta_inicio=`cat Contador.txt`
Total_uds=`expr $Conta_inicio + $Conta_uds`
for i in `seq 1 $Conta_uds`
do
Salida=`printf "%s" $Inicio1``printf "%08d" $Conta_inicio``printf "%s" $Linaje`
echo $Salida >> $Fichero
Conta_inicio=`expr $Conta_inicio + 1`
done
echo $Total_uds > Contador.txt
}

# Pedimos el apellido del escudo usado
echo "Introduzca el linaje al que corresponde el gráfico (en mayúsculas)"
read Linaje

# Pedimos la cantidad de lineas a generar
echo "Indique el número de unidades a generar"
read Conta_uds

# Pedimos el tipo de trabajo que hemos realizado
echo "Selecciona el tipo de archivo de salida"
echo "1) Ex-Libri"
echo "2) Blasón unitario"
echo "3) Blasón doble"
echo "4) Certificado"
echo "5) Diploma"
read Valor1
case $Valor1 in
1) Inicio1="AHDAEL"
Fichero="EL"`date +%Y%m%d`".txt"
echo $Fichero
Ariza_Contador
;;
2) Inicio1="AHDABL"
Fichero="BL"`date +%Y%m%d`".txt"
echo $Fichero
Ariza_Contador
;;
3) Inicio1="AHDAB2"
Fichero="B2"`date +%Y%m%d`".txt"
echo $Fichero
Ariza_Contador
;;
4) Inicio1="AHDACE"
Fichero="CE"`date +%Y%m%d`".txt"
echo $Fichero
Ariza_Contador
;;
5) Inicio1="AHDADI"
Fichero="DI"`date +%Y%m%d`".txt"
echo $Fichero
Ariza_Contador
;;
*) echo "Ha pulsado una tecla o combinación de teclas no aceptada"
echo "por favor, pulse un número del 1 al 5"
;;
esac

Este ya me da el resultado que esperaba; edito el título del post ya que ahora esta solucionado.

+1
0
-1