Dividindo o diretório de trabalho em um script bash

3

Se eu fizer:

IFS="/" read -ra PARTS

E digite um caminho manualmente, ele cria o array "PARTS" como esperado:

IFS="/" read -ra PARTS <<< $(pwd)

cria um array com um único elemento, com as barras convertidas em espaços

Como posso dividir o diretório de trabalho atual em uma matriz?

    
por Brent 02.04.2015 / 17:53

2 respostas

5

Funciona se você citar o comando.

IFS="/" read -ra PARTS <<< "$(pwd)"
for i in "${PARTS[@]}"
do
  printf '%s\n' "$i"
done

home
user1
    
por 02.04.2015 / 18:09
-1

Como a questão é

How can I split the current working directory into an array?

(e não "Como eu obtenho IFS="something" read -a arrayname <<< $(command) para trabalhar? ”), eu te dou

saveIFS="$IFS"; IFS=/ PARTS=($(pwd)); IFS="$saveIFS"

Sim, eu sei; é feio. Eu tentei

IFS=/ PARTS=($(pwd))

e

e deixou IFS definido como / , mesmo se eu incluísse o comando inteiro em {;} ou usasse eval . Naturalmente, colocando-o em () causou PARTS não deve ser definido no shell principal.

IFS=/ declare PARTS=($(pwd))

falhou ainda pior.

O primeiro bloco de código (com saveIFS ) salva o valor antigo do IFS e restaura-o (depois de alterá-lo). No entanto, se o IFS não estava definido anteriormente, o código acima define uma string vazia (comumente chamada de string nula). Se esta é uma possibilidade em seu ambiente, e você quer ser capaz de restaurar o IFS para não ser definido, você pode fazer isso:

checkIFS="${IFS+1}"
saveIFS="$IFS"
IFS=/ PARTS=($(pwd))
if [ "$checkIFS" ]
then
    IFS="$saveIFS"
else
    unset IFS
fi

(ou, tudo em uma linha)

checkIFS="${IFS+1}"; saveIFS="$IFS"; IFS=/ PARTS=($(pwd)); if [ "$checkIFS" ]; then IFS="$saveIFS"; else unset IFS; fi

Aqui, checkIFS é definido como 1 se o IFS não estiver definido, e é definido como nulo se o IFS for definido. Em seguida, ele faz o teste óbvio para restaurar o IFS ao estado anterior (definido) / (não definido), e restaurar seu valor anterior se houvesse um.

Claro, se você está muito preocupado em deixar o ambiente inalterado (exceto pela variável PARTS ), você também deve remover checkIFS e saveIFS .

    
por 02.04.2015 / 21:57