2013-05-13 1 views
1

у меня есть следующие строки в Башестранного поведения при оценке пробелов в строке в Баше

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

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

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

$echo ${pseed:0:3} 
0 

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

, но когда я dsplay второй 0 с

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

я 0 0 и это неожиданно.

Что происходит?

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

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

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

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

ответ

1

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

$ 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 
0

Из имеющейся документации here:

${string:position:length} 

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

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

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

+0

, как вы можете видеть, что моя строка содержит число в каждом блоке из 3 персонажей. если число <100, то число заполняется пробелами – MOHAMED

+0

, и я хочу извлечь все числа с общим форматом '$ {pseed: 3 * i: 3 * i + 3}' и я хочу использовать этот формат через некоторое время loop – MOHAMED

+0

В этом случае третий параметр всегда равен * 3 *: '$ {pseed: 3 * i: 3}'. Помните, что третий параметр - это длина, а не конечная позиция. – Phylogenesis