Matriz de división de Linux en variables separadas

4

He estado programando en MVS durante años y recientemente he estado usando Linux, por lo que mis habilidades con Linux aún no son tan buenas, pero entiendo bien los conceptos de desarrollo.

Lo que intento hacer es leer un directorio de archivos y tomar el nombre de todos los archivos con una extensión de .trg. Luego, necesito tomar esos nombres y almacenarlos en variables separadas para poder usarlos más adelante en mi script para referirme a los componentes y usarlos para nombrar archivos. Obtuve los nombres de archivo usando el comando find:

param=`find *${file_name}*.trg

Esto produjo la variable $ param cargada con los valores (ABC1099R ABC1099C) ya que son dos archivos en el directorio llamado ABC1099R.trg y ABC1099C.trg. Ahora necesito asignar esos valores a variables individuales para poder usarlos más adelante en mi script. He buscado arriba y abajo en la web, pero cada ejemplo que encuentro está usando echo para mostrarlos o están usando un bucle do while y los valores individuales dentro del bucle. Necesito tenerlos asignados a sus propias variables para que estén disponibles para mí más adelante en el script.

Inicialmente probé un bucle for do como este:

for trigger_files in $param; do
    app1=(basename "{trigger_files}" .trg).dat
done

Pero eso solo da la primera aparición app1 = ABC1099R

Necesito tener todas las ocurrencias guardadas en su propia variable individual. Podría haber potencialmente 20 nombres de archivo, pero pensé que solo necesitaba que funcionara con dos, por lo tanto, sería capaz de manejar muchos.

usuario50228
fuente
Corrección: el comando de búsqueda produjo los valores ABC1099R.trg y ABC1099C.trg. También necesito eliminar el .trg de los valores en las variables, pero creo que puedo manejar eso, realmente necesito sugerencias sobre cómo tomar esa matriz y asignar a variables individuales. Gracias.
user50228
Hola y bienvenido a U&L, nos complace tenerte aquí. En lugar de dejar el comentario de las correcciones, puede editar su publicación como desee y corregirla de esa manera. Es más fácil de leer para futuros visitantes y hace que el sitio sea más limpio y fácil de navegar. Háganos saber si tiene alguna pregunta 8-)
slm
Como eres nuevo en las secuencias de comandos Bash, es posible que desees pasar un tiempo familiarizándote con sus trampas: mywiki.wooledge.org/BashPitfalls
slm

Respuestas:

9

Si está usando , considere hacerlo de la manera bash.

Su matriz se obtendría así (sin findcomando externo ):

params=( *${file_name}*.trg )

y luego recorres la matriz de esta manera:

for file in "${params[@]}"; do
    echo "I'm happily reading the beautiful file $file"
done

Si desea eliminar la .trgextensión y reemplazarla con .banana:

for file in "${params[@]}"; do
    echo "My gorilla loves the file ${file%.trg}.banana"
done

Este método, con una cita adecuada, será 100% seguro con respecto al archivo con símbolos divertidos en sus nombres.

Observación. Siempre use globbings con cualquiera shopt -s nullglobo shopt -s failglob.

gniourf_gniourf
fuente
2

Puede declarar param como una matriz en lugar de como una cadena:

declare -a param=(`find *${file_name}*.trg`)

Ahora puede acceder a los valores individuales utilizando un índice como si fueran variables individuales. Por ejemplo:

echo ${param[1]}

se imprimirá ABC1099C.trg(el segundo elemento en la matriz. El índice comienza con 0).

Si desea deshacerse de la extensión de archivo, puede intentar ${param[1]%.*}

Para obtener más información sobre las matrices, eche un vistazo aquí:

mxlian
fuente