Що означає $ {1: 0: 2} у цьому контексті?


19

Я переглядаю код, показаний нижче, і він перевіряє вхідні дані, якщо аргументи рядків / стовпців починаються з -rабо -c. Що ${1:0:2}означає в цьому контексті?

rowArgName="-r"
colArgName="-c"
if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ]
then
   echo $correctCmdMsg >&2
   exit 1
fi

7
Ви повинні включити до запитання оболонку, яку ви використовуєте. Що, мабуть bash.
Рафаель Аренс

2
Здається, це робиться для аналізу аргументів командного рядка. Ймовірно, ви захочете дізнатися про getoptабо getoptsполегшити своє життя (або життя того, хто це робив).
Карлос Кампдеррос

Відповіді:


31

Це шаблон розширення підрядків (підклас розширення параметрів) оболонки.

Формат:

${parameter:offset:length}

а індексація починається з 0.

Скажімо, у вас є змінна foo, після чого ${foo:0:2}виходять перші два символи (з позиції 0 наступні 2).

Приклад:

$ foo=spamegg
$ echo "${foo:0:2}"
sp

У вашому випадку перше число 1посилається на ім'я змінної $1, яке є першим аргументом, переданим командним рядком (в основній програмі) або першим аргументом, переданим функції.

Тож у вашому випадку "${1:0:2}"буде:

  • почнемо витягувати підрядку, починаючи з індексу 0, тобто першого символу

  • і продовжуйте виконувати наступні два символи

тож після операції ви отримаєте перші два символи (індексовані на 0 і 1) вхідного рядка.

The [ "${1:0:2}" != $rowArgName ]і [ "${1:0:2}" != $colArgName ]перевіряють, чи є вихідний підрядник рівним деяким іншим рядкам.


1
По суті, це перевірка того, чи надав користувач 1 долар -cчи -r, що, можливо, краще було реалізованоgetopts
Сергій Колодяжний

15

Невеликий витяг з man bash:

$ {параметр: зміщення: довжина}

Розширення підрядків . Розширюється до lengthсимволів значення, parameterпочинаючи з символу, заданого символом offset. Якщо параметр @, індексований масив індексний @або *, або асоціативне ім'я масиву, результати відрізняються , як описано нижче. Якщо lengthпропущено, розширюється на підрядку значення, parameterпочинаючи з символу, заданого символом, offset і поширюється до кінця значення. length і offset є арифметичними виразами (див. АРИТМЕТИЧНУ ОЦІНКУ нижче).


5

Це просте вилучення підрядків зі змінної. Розглянута змінна є першим параметром сценарію (який є 1).

Якщо у мене є змінна FOO, я можу побачити перші два символи її значення ${FOO:0:2}. Те ж саме робиться у вашому прикладі з першим аргументом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.