Что означает $ {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
user165213
источник
7
Вы должны включить в вопрос оболочку, которую вы используете. Что, вероятно bash.
Рафаэль Аренс
2
Похоже, это делается для разбора аргументов командной строки. Возможно, вы захотите узнать о getoptили getoptsсделать вашу жизнь проще (или жизнь того, кто это сделал).
Карлос Кампдеррос

Ответы:

31

Это шаблон оболочки Substring Expansion (подкласс расширения параметров).

Формат такой:

${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) входной строки.

[ "${1:0:2}" != $rowArgName ]И [ "${1:0:2}" != $colArgName ]проверяет , если выход subtring равно некоторые другие строки.

heemayl
источник
1
По сути, он проверяет, предоставил ли пользователь 1 доллар с -cили -r, что, вероятно, лучше было бы реализоватьgetopts
Сергей Колодяжный
15

Небольшая выдержка из man bash:

$ {Параметр: смещение: длина}

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

Ральф Реннквист
источник
5

Это простое извлечение подстроки из переменной. Рассматриваемая переменная является первым параметром скрипта (который есть 1).

Если у меня есть переменная, FOO, я могу видеть первые два символа ее значения с ${FOO:0:2}. То же самое делается в вашем примере с первым аргументом.

DopeGhoti
источник