Um casal muda e deve funcionar:
Geralmente, quando você usa uma variável como você fez no eco, a variável original permanece como estava, então o uso da string 2 é totalmente desnecessário. Além disso, eu tenho o hábito de usar chaves para {incluo} variáveis para que elas possam ser referenciadas dentro do texto, as chaves funcionam para delimitar o nome da variável, basta colocar o sinal de dólar na frente (exemplo a seguir). >
1- Ao definir pela primeira vez a string1, não coloque espaços em nenhum dos lados do sinal de igual.
2- ao atribuir os resultados de um comando a uma variável, você tem que forçar o comando a ser executado, os ticks de volta única (o caracter à esquerda da tecla nº 1 nos teclados dos EUA) em torno do comando fazem isso.
3- observe o número de caracteres que você cortou, seu código e exemplo não concordam.
Então essa linha deve se parecer com:
string1='echo $pos | cut -c 20-38'
A outra coisa é quando você define um valor de outro, não inclua o sinal de igual extra. Então, o código para definir string2 deve ser semelhante:
string2="$pos"
Acredito que o seguinte fará o que você solicitar, ajustei a contagem de caracteres para fornecer a saída do seu exemplo:
O "arquivo" de entrada do meu teste continha:
abcdefghi1234567890QWERTYUXY.tar.gz
E meu roteiro é:
#!/bin/sh
while read pos; do
string1='echo ${pos} | cut -c 10-28'
echo "${string1} ${pos}"
done < file
A saída parece:
1234567890QWERTYUXY abcdefghi1234567890QWERTYUXY.tar.gz
Qual é exatamente o que eu acredito que você está pedindo.