como dividir a string antes e depois do espaço no shell script?

17

Estou tendo uma variável que mostra eco assim

$ echo $var
129 148

Eu tenho que tomar apenas 129 como saída. Como vou dividir 129 e 148?

surbhi
fonte
echo "${var% *}" && echo "${var#* }"...
jasonwryan
possível duplicação de Como funcionam $ {0 ## * /} e $ {0% / *}?
jasonwryan

Respostas:

31

Além da sugestão de jasonwryan , você pode usar cut:

echo $var | cut -d' ' -f1

O exemplo acima cuté a echosaída com um delimitador de espaço ( -d ' ') e gera o primeiro campo ( -f1)

Joseph R.
fonte
Não está funcionando. eu já usei. diz comando não encontrado.
Surbhi
3
@surbhi O que diz comando não encontrado? cuté um utilitário padrão. Seu script provavelmente tem um erro em outro lugar. De um modo mais geral, nunca diga "não está funcionando". Sempre diga exatamente qual código você executou, exatamente o que aconteceu e copie e cole as mensagens de erro.
Gilles 'SO- stop be evil' '
Essa resposta deve ser aceita, pois é a maneira mais concisa e direta. Não funcionará em casos mais complicados do que o exemplo dado, é claro.
Dan Nguyen
9

Uma maneira elegante de fazer isso é usar uma matriz bash para dividir uma sequência em espaços. Você pode declarar uma matriz simplesmente usando colchetes:

var="129 148     181"
vars=( $var )
echo "First  word of var: '${vars[0]}'"
echo "Second word of var: '${vars[1]}'"
echo "Third  word of var: '${vars[2]}'"
echo "Number of words in var: '${#vars[@]}'"
gogoud
fonte
isto diz que o comando não foi encontrado
surbhi 19/03/2015
Depende de você usar o bash. Se você estiver usando um shell diferente, ele pode não funcionar. echo $SHELLdeve mostrar: /bin/bashou similar.
gogoud
Não funciona em zsh; (
TonyH
Isto funciona em ZSH zoom="one two three"; declare -a zoomie=( $( echo $zoom | cut -d' ' -f1- ) ); echo ${zoomie[2]};
TonyH