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


17

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

$ echo $var
129 148

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


echo "${var% *}" && echo "${var#* }"...
Джейсонвриан

Ответы:


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[@]}'"

это говорит, что команда не найдена
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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.