Funciona se você citar o comando.
IFS="/" read -ra PARTS <<< "$(pwd)"
for i in "${PARTS[@]}"
do
printf '%s\n' "$i"
done
home
user1
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?
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
.
Tags bash shell-script string array quoting