2011-12-20 3 views
2

Это я сражен:

function x 
{ 
    echo "/${1:0:1}/${1:1:1}/${1:2:1}/${1:3:1}/${1:4:1}/${1:5:1}/" 
} 

$ x 123456 

в ЗШ принтами:

/1/1/2/3/4/5/ 

в Баш печатает:

/1/2/3/4/5/6/ 

Все, что я прочитал говорит, что ЗШ использует смещение нулевой точки, как Баш, так как на земле может ${1:0:1} = ${1:1:1}?

+0

Помилование Джентльмены, ошибка синтаксиса. Тот факт, что вышеупомянутый «вид работы» заставлял меня думать, что проблема не была синтаксисом как таковым. Кажется, что zsh и bash более разные, чем я ожидал. И теперь я вижу, что я не могу использовать: $ 1 [0,1] I hafta: var = $ 1; $ Var [0,1]; чтобы заставить его работать :( –

+0

... и я нахожу, что: $ var [0,0] не существует, поэтому кажется, что смещения основаны на одном, а не на нулевом уровне. –

ответ

0

Все, что я читал, говорит о том, что zsh использует нулевое смещение, как и bash, так как, на самом деле, $ {1: 0: 1} == $ {1: 1: 1} ??

Неверно, если вы не установили ksharrays. Даже в этом случае ${1:0:1} сохранит свое поведение, этот параметр применим только к форме ${array[subscript]}/${a[s1,s2]}, а не к ${array:subscript}/${a:s:l}. Обработка такой формы описана в разделе «РАСПРОСТРАНЕНИЕ ПАРАМЕТРОВ» в man zshexpn. Форма ${a[s1,s2]} описана в разделе «МАШИНЫ ПАРАМЕТРЫ» в man zshparam.

+0

Спасибо ZyX, по крайней мере сейчас я знаю, где изучить это. –

1

Смещение в ${name:offset} или ${name:offset:length} всегда начинается с 0, независимо от значения опции ksh_array (в отличии от $name[offset]). Но есть исключение, которое documented:

Для дальнейшей совместимости с другими оболочками есть частный случай для массива смещения 0. Это, как правило, обращается к первому элементу массива. Однако, если подстановка относится к массиву позиционных параметров, например. [email protected] или $*, а затем смещение 0 означает $0, смещение 1 относится к $1 и так далее. Другими словами, массив позиционных параметров эффективно расширяется путем добавления $0. Следовательно, ${*:0:1} заменяет $0 и ${*:1:1} заменяет $1.

Похоже, отдельные позиционные параметры также страдают от этого исключения:

zsh -c 'x=abcdef; set ABCDEF; echo ${1:1:1} ${x:1:1}' 
A b 

Это выглядит как ошибка, так как ограничение имеет смысл только для массива позиционного параметра. Спасибо за reporting it; есть patch, который должен быть включен в 4.3.16.

+0

Трудно поверить, что такой простой вещи нельзя было заметить. Где я могу сообщить об этом? Или, может быть, мне нужно просто вернуться к bash, я потратил последние несколько дней на то, чтобы преобразовать свои функции в zsh, и нет никаких проблем. Только сейчас я нахожу, что больше не могу схватить нажатие клавиши «читать». –

+0

Функция z { var = $ 1 echo "var:/$ {1: 0: 1}/$ {1: 1: 1}/$ {1: 2: 1} /" echo "var:/$ {вар: 0: 1}/$ {вар: 1: 1}/$ {вар: 2: 1} /» } $ г ABCDE вар:/а/A/B/ вар:/a/b/c/ –

+0

Извините, это выглядит ужасно, но я не могу ответить на свой вопрос, и поле комментариев не будет форматироваться. Суть в том, что если я «var = $ 1», тогда все работает так, как я ожидал. Это все так странно –

0
function z 
{ 
    var=$1 
    echo "var:/${1:0:1}/${1:1:1}/${1:2:1}/" 
    echo "var:/${var:0:1}/${var:1:1}/${var:2:1}/" 
} 

$ г ABCDE

вар:/а/а/б/

вар:/A/B/C/

+0

Итак, я отправил это на [email protected] –

+0

Спасибо; похоже, что он будет [исправлен в следующей версии] (http://www.zsh.org/mla/workers//2011/msg01459.html). – Gilles

Смежные вопросы