Странное поведение при оценке пробелов в строке в bash

У меня есть следующая строка в bash

pseed="  0  0  0 45 46 78 99100" #there is 2 spaces between 2 zeros

Моя строка содержит число в каждом блоке из 3 символов. если число ‹ 100, то число дополняется пробелами. И я хочу извлечь все числа с общим форматом ${pseed:3*i:3}, и я хочу использовать этот формат в цикле while

когда я хочу отобразить первый 0 с помощью:

$echo ${pseed:0:3}
0

Я получаю 0 как и ожидалось

но когда я отображаю второй 0 с

$echo ${pseed:3:6}
0 0

Я получаю 0 0, и это неожиданно.

Что творится?

Я заметил, что при отображении:

$pseed="  0  0  0  0"
$echo $pseed
0 0 0 0

между нулями только один пробел.

Как избежать такого поведения в bash?


person MOHAMED    schedule 13.05.2013    source источник


Ответы (2)


Вам нужно указать расширение вашей переменной, чтобы произвольные прогоны пробелов не рассматривались как разделитель одного слова.

$ pseed="  0  0  0 45 46 78 99100"
$ echo x${pseed:3:6}x
x 0 0x
$ echo "x${pseed:3:6}x"
x  0  0x

Расширение bash для встроенной команды read немного упрощает извлечение полей фиксированной ширины из строки:

arr=()
while read -n 3 num; do   # -n 3: read 3 characters at a time
    arr+=($num)
done <<< "$pseed"         # Quote to preserve whitespace
person chepner    schedule 13.05.2013

Из документации, доступной здесь:

${string:position:length}

Extracts $length characters of substring from $string at $position.

Я считаю, что вы должны попытаться повторить ${pseed:3:3}, чтобы получить один 0.

Что касается второй части вопроса, эхо видит 4 параметра и выводит их с одним пробелом между ними. Чтобы сохранить пробелы, вам нужно использовать echo "$pseed".

person Phylogenesis    schedule 13.05.2013
comment
как вы можете видеть, моя строка содержит число в каждом блоке из 3 символов. если число ‹ 100, то число дополняется пробелами - person MOHAMED; 13.05.2013
comment
и я хочу извлечь все числа с общим форматом ${pseed:3*i:3*i+3}, и я хочу использовать этот формат в цикле while - person MOHAMED; 13.05.2013
comment
В этом случае третий параметр всегда равен 3: ${pseed:3*i:3}. Помните, что третий параметр — это длина, а не конечная позиция. - person Phylogenesis; 13.05.2013
comment
вы правы, мое выражение было неправильным. я обновил в вопросе - person MOHAMED; 13.05.2013