Eu tenho uma corda -w o rd
.
Eu preciso dividi-lo para w o r d
ou para uma matriz, pois 'w' 'o' 'r' 'd'
isso realmente não importa.
ja tentei o seguinte
IFS='\0- ' read -a string <<< "-w o rd"
echo ${string[*]}
rd
não está sendo dividido. Como faço para dividir
Você não pode usar o IFS no bash para dividir em nada ( tem que ser em um caractere). Não há caracteres entre
r
ed
emrd
. Nenhum espaço e nenhum caractere não é o mesmo que o caractere nulo.Se você quiser cada caractere como um elemento separado na matriz, uma maneira que posso pensar é ler cada caractere individualmente e anexá-lo a uma matriz (e usando IFS para se livrar de espaços e
-
):Você pode remover os caracteres indesejados com
${var//pattern/replacement}
:E, em seguida, use a expansão de substring para escolher um caractere de cada vez:
(parece até funcionar com caracteres de vários bytes, pelo menos no meu sistema.)
Observe que
IFS='\0- '
atribuirá uma barra invertida literal a umaIFS
vez que a barra invertida não tem significado especial entre aspas simples. O escape octal funcionaria dentro de$'...'
, mas as variáveis no Bash não podem conter um byte NUL, então isso não ajuda. (A string é cortada no NUL, então, por exemplo,x=$'foo\0bar'; printf "%q\n" "$x"
imprime apenasfoo
. Além disso, o que @muru disse, dividir em um byte NUL não é o mesmo que dividir entre todos os caracteres)Se sua string não for muito longa:
Você pode transformar a coisa boba em algo mais desagradável, seguro para IFS e glob e que leva em consideração as diferenças na ordem relativa da chave e expansões de variáveis entre
zsh
,bash
eksh
:Mas, francamente, o único uso de tal monstruosidade pode ser assustar os novatos e impressionar os tolos com um suposto profundo conhecimento das minúcias da linguagem shell ;-)