2013-06-07 3 views
1

У меня есть записи формы: cat:rat, и я хотел бы присвоить их отдельным переменным в bash. Я в настоящее время в состоянии сделать это с помощью:Есть ли лучший способ получить элементы разделенной пары в bash?

A=$(echo $PAIR | tr ':' '\n' | head -n1) 
B=$(echo $PAIR | tr ':' '\n' | tail -n1) 

, после чего $A и $B, соответственно, кошки и крысы. эхо, две трубы, и все чувствуют себя немного как перебор, я пропускаю гораздо более простой способ сделать это?

ответ

6

Использование команды read

entry=cat:rat 
IFS=: read A B <<< "$entry" 
echo $A # => cat 
echo $B # => rat 
+0

ах, это проще, чем чтение в массив, +1 – iruvar

+1

+1, но, возможно, добавьте дополнительные параметры (например, 'IFS =: read -r AB <<<" $ entry "' для обработки большего количества случаев? (Необязательно с этим значением входа, хотя ...) –

2

Да, используя bash parameter substitution

PAIR='cat:rat' 
A=${PAIR/:*/} 
B=${PAIR/*:/} 
echo $A 
cat 
echo $B 
rat 

С другой стороны, если вы готовы использовать массив вместо отдельных переменных:

IFS=: read -r -a ARR <<<"${PAIR}" 
echo ${ARR[0]} 
cat 
echo ${ARR[1]} 
rat 

EDIT: См ответ Glenn Джекмана для самых элегантных read основанное раствор

+0

Альтернативой синтаксису '$ {var /: * /}' будет '$ {var #: *}' и '$ {var% *:}'. Это не обязательно лучше, но было вокруг дольше, поэтому может работать лучше, если вы где-нибудь столкнетесь с древней версией 'bash' (также работает на' ksh' и 'zsh'). – twalberg

+0

@twalberg, отличная точка. – iruvar

0
animal="cat:rat" 
A=echo ${animal} | cut -d ":" -f1 
B=echo ${animal} | cut -d ":" -f2 

не может быть лучшим решением. Просто дайте вам возможное решение.