Isso fará o que você quiser
read -a words <<< ${MAPFILE[0]}
E de acordo com isso, link você deve sempre usar um "-r", ou seja,
read -r -a words <<< ${MAPFILE[0]}
$ echo ${words[0]}
asdf1
Eu tenho um arquivo de entrada de amostra chamado in com o seguinte conteúdo:
m@m-X555LJ:~/wtfdir$ cat in
asdf1 jkl1
asdf2 jkl2
asdf3 jkl3
Eu agora executo:
m@m-X555LJ:~/wtfdir$ mapfile < ./in
Como esperado, a variável MAPFILE agora é uma matriz que divide o arquivo in em linhas:
m@m-X555LJ:~/wtfdir$ echo ${MAPFILE[0]}
asdf1 jkl1
m@m-X555LJ:~/wtfdir$ echo ${MAPFILE[1]}
asdf2 jkl2
Então agora eu quero quebrar a primeira linha em palavras. AFAIK read -a arrname lê uma linha da entrada padrão, divide em palavras e armazena o resultado em uma matriz chamada arrname . Então eu digito:
m@m-X555LJ:~/wtfdir$ echo ${MAPFILE[0]} | read -a words
No meu modelo mental, isso é o que deve acontecer: echo ${MAPFILE[0]} ecoa a primeira linha de MAPFILE (ou seja, asdf1 jkl1 ) na saída padrão, mas isso é canalizado na entrada padrão de read -a words , então read deve ler esta linha e dividi-la em palavras e armazenar o resultado em uma matriz chamada words .
No entanto, infelizmente, isso não acontece:
m@m-X555LJ:~/wtfdir$ echo ${words[0]}
m@m-X555LJ:~/wtfdir$
Sim. echo ${words[0]} não imprime nada, enquanto eu esperava imprimir asdf1 .
Por que isso acontece? E onde está o meu erro? E como fazer isso funcionar?
Isso fará o que você quiser
read -a words <<< ${MAPFILE[0]}
E de acordo com isso, link você deve sempre usar um "-r", ou seja,
read -r -a words <<< ${MAPFILE[0]}
$ echo ${words[0]}
asdf1
Tags bash shell-script