Como ler um arquivo de mapa

0

Eu tenho um código semelhante a este:

while read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH; do 
        echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
done< <(ll | tail -n+2 | head -2)

(Na verdade, não estou usando ls / ll , mas acredito que esse exemplo traduzido exiba o mesmo problema que estou tendo)

O problema é que preciso de uma instrução condicional se ll | tail -n+2 | head -2 falhar, por isso estou tentando criar um arquivo de mapeamento e, em seguida, read em um script. O mapfile é criado corretamente, mas não sei como redirecioná-lo para que seja lido corretamente.

código

if ! mapfile -t TEST_ARR < <(ll | tail -n+2 | head -2); then
        exit 1
fi
while read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH; do 
        echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
done<<<"${TEST_ARR[@]}"

conteúdo do arquivo de mapeamento

declare -a TEST_ARR=(
        [0]="drwxr-xr-x@ 38 wheel   1.2K Dec  7 07:10 ./" 
        [1]="drwxr-xr-x  33 wheel   1.0K Jan 18 07:05 ../"
)

saída

$ while read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH; do
>             echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
>     done<<<"${TEST_ARR[@]}"
drwxr-xr-x@
38
wheel
1.2K
Dec
7

O redirecionamento de string está claramente errado neste caso, mas não tenho certeza de como mais posso redirecionar meu array.

    
por Jesse_b 19.01.2018 / 23:30

2 respostas

2

Parece-me que você está querendo percorrer seu array, lendo os elementos em colunas:

for ele in "${TEST_ARR[@]}"
do
  read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH <<< "$ele"
  echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
done
    
por 20.01.2018 / 02:36
1

mapfile lê o conteúdo de um arquivo em uma matriz, e se você usar "${array[@]}" em um contexto como uma atribuição ou <<< que usa apenas uma única sequência, ele concatena todos os elementos da matriz em uma única cadeia . Um pouco como "${array[*]}" , exceto @ unido a espaços e * com o primeiro caractere de IFS .

Agora, você disse que "criou um arquivo de mapa", mas não acho que seja assim que o nome do comando deve ser interpretado. É mais parecido que "mapeia" um arquivo para um array. (Exceto que é uma cópia, não um mapeamento bidirecional como pode ser em alguns idiomas.) O nome alternativo de readarray é provavelmente mais preciso.

    
por 20.01.2018 / 12:45