Tu harías:
unset -v line1 line2
{ IFS= read -r line1 && IFS= read -r line2; } < input.txt
O:
{ line1=$(line) && line2=$(line); } < input.txt
(menos eficiente ya line
que rara vez está incorporado y la mayoría de los shells necesitan bifurcarse para implementar la sustitución de comandos. line
Tampoco es un comando estándar).
Para usar un bucle:
unset -v line1 line2 line3
for var in line1 line2 line3; do
IFS= read -r "$var" || break
done < input.txt
O para definir automáticamente los nombres de las variables como line<++n>
:
n=1; while IFS= read -r "line$n"; do
n=$((n + 1))
done < input.txt
Tenga en cuenta que bash
admite variables de matriz y una función readarray
integrada para leer líneas en una matriz:
readarray -t line < input.txt
Sin embargo , tenga en cuenta que, a diferencia de la mayoría de los otros shells, los bash
índices de matriz comienzan en 0, no en 1 (heredado de ksh
), por lo que la primera línea estará en ${line[0]}
, no ${line[1]}
(aunque, como ha demostrado @Costas , puede hacer readarray
(también conocido comomapfile
) comience a escribir los valores en el índice 1 (las bash
matrices también son contrarias a que la mayoría de las otras capas sean matrices dispersas ) con -O 1
).
Ver también: ¿ Entender "IFS = read -r line"?