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 lineque rara vez está incorporado y la mayoría de los shells necesitan bifurcarse para implementar la sustitución de comandos. lineTampoco 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 bashadmite variables de matriz y una función readarrayintegrada 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 bashmatrices 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"?