Então, você tem seu script (apenas um pouco modificado para adicionar #!
-line e aspas em torno da expansão de $1
para suportar a leitura de arquivos com nomes de arquivos incomuns),
#!/bin/sh
cat "$1"
Agora você quer chamar este script com uma matriz
arr=( 1 2 3 4 5 )
para que, em vez de ler um arquivo (que seu script está fazendo), ele leia o valor delimitado por nova linha de seu array, produzindo
1
2
3
4
5
como saída?
É assim que isso pode ser feito:
printf '%s\n' "${arr[@]}" | ./script -
ou
printf '%s\n' "${arr[@]}" | ./script /dev/stdin
Isso passaria -
ou /dev/stdin
para seu script como o arquivo a ser lido. O cat
interpretará -
como entrada padrão e, se fornecido /dev/stdin
, também lerá da entrada padrão.
Os dados são fornecidos na entrada padrão por printf
, que fornece como elementos delimitados por novas linhas da matriz.
O mesmo efeito seria com
( IFS=$'\n'; sh ./script.sh - <<<"${arr[*]}" )
onde os dados são fornecidos por meio de uma string here. Usando "${arr[*]}"
, unimos os elementos da matriz em uma única string separada pelo primeiro caractere de $IFS
(que definimos como uma nova linha). Estou usando um subshell aqui para evitar a modificação de IFS
no ambiente ao redor.