¿Alguien puede explicar por qué lo siguiente no funciona, por favor?

Lista

the letter is d
the number is 4
the number is 2
the letter is g

Script.sh

#!/bin/bash

cat "$1" | grep letter | array=($(awk '{print $4}'))

for i in "${array[@]}"
do
  :
  echo $i
done

Si ejecuto esto bash script.sh list espero que la matriz imprima d y g, pero no lo hace. Creo que es por cómo estoy tratando de configurar la matriz.

0
Chris 23 dic. 2019 a las 00:51

2 respuestas

La mejor respuesta

Creo que es por cómo estoy tratando de configurar la matriz.

Cada comando en una tubería | se ejecuta en una subshell, como un proceso separado. El proceso padre no "ve" los cambios variables de un proceso hijo.

Sólo:

array=($(grep letter "$1" | awk '{print $4}'))

O

array=($(awk '/letter/{print $4}' "$1"))

Ejecute la asignación de variables en el shell principal.

2
KamilCuk 22 dic. 2019 a las 22:27

Debe asignar la fila completa de comandos canalizados a una variable.

array=($(cat "$1" | grep letter | awk '{print $4}'))

Los comandos cat y grep se pueden combinar con awk, pero ¿por qué quieres una matriz?
Creo que quieres procesar cada elemento en un bucle, así que primero elimina las comillas dobles:

for i in ${array[@]}
do
  :
  echo $i
done

A continuación, intente hacer esto sin una matriz

while read -r i; do
  :
  echo $i
done < <(awk '/letter/ {print $4}' "$1")
1
Walter A 22 dic. 2019 a las 22:35