Как разделить строку после и до пробела в сценарии оболочки?

17

У меня есть переменная, которая показывает на эхо, как это

$ echo $var
129 148

Я должен взять только 129 в качестве выхода. Как я разделю 129 и 148?

Surbhi
источник
echo "${var% *}" && echo "${var#* }"...
Джейсонвриан
Возможный дубликат Как работают $ {0 ## * /} и $ {0% / *}?
Джейсонвриан

Ответы:

31

В дополнение к предложению jasonwryan вы можете использовать cut:

echo $var | cut -d' ' -f1

Выше cutх годов echoвыход с космическим разделителем ( -d ' ') и выводит первое поле ( -f1)

Джозеф Р.
источник
это не работает. Я уже использовал это. это говорит, что команда не найдена.
Surbhi
3
@surbhi Что говорит команда не найдена? cutэто стандартная утилита. Возможно, ваш скрипт содержит ошибку где-то еще. В целом, никогда не говорите «это не работает». Всегда говорите, какой именно код вы выполняли, что именно произошло, и сообщения об ошибках копирования и вставки.
Жиль "ТАК - перестань быть злым"
Этот ответ следует принять, так как это самый лаконичный и прямой способ. Конечно, это не будет работать в случаях, которые являются более сложными, чем приведенный пример.
Дэн Нгуен
10

Оптимальный способ сделать это - использовать массив bash для разделения строки на пробелы. Вы можете объявить массив, просто используя скобки:

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
источник
это говорит, что команда не найдена
Surbhi
Это зависит от того, используете ли вы bash. Если вы используете другую оболочку, она может не работать. echo $SHELLдолжен показать: /bin/bashили аналогичный.
gogoud
не работает zsh; (
TonyH
Это делает работу в ZSH zoom="one two three"; declare -a zoomie=( $( echo $zoom | cut -d' ' -f1- ) ); echo ${zoomie[2]};
TonyH