Co w tym kontekście oznacza {1: 0: 2} $?

19

Szukam do kodu wyświetlane poniżej i sprawdza dane wejściowe jeśli argumenty wiersz / kolumna zacząć albo -rlub -c. Co ${1:0:2}znaczy w tym kontekście?

rowArgName="-r"
colArgName="-c"
if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ]
then
   echo $correctCmdMsg >&2
   exit 1
fi
użytkownik165213
źródło
7
Do pytania należy dołączyć używaną powłokę. Co jest prawdopodobnie bash.
Raphael Ahrens,
2
Wydaje się, że zostało to zrobione w celu przeanalizowania argumentów wiersza poleceń. Prawdopodobnie będziesz chciał wiedzieć getoptczy getoptsaby ułatwić Ci życie (lub życie kogo to zrobił).
Carlos Campderrós,

Odpowiedzi:

31

Jest to wzorzec powłoki Substring Expansion (subclass of Parameter Expansion).

Format to:

${parameter:offset:length}

a indeksowanie zaczyna się od 0.

Powiedzmy, że masz zmienną foo, a następnie ${foo:0:2}daje dwa pierwsze znaki (od pozycji 0 kolejne 2).

Przykład:

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

W twoim przypadku pierwsza liczba 1odnosi się do nazwy zmiennej $1, która jest pierwszym argumentem przekazanym z wiersza poleceń (w programie głównym) lub pierwszym argumentem przekazanym do funkcji.

W twoim przypadku "${1:0:2}":

  • zacznij wyodrębniać podciąg, zaczynając od indeksu 0, czyli pierwszego znaku

  • i przejdź do następnych dwóch znaków

więc po operacji otrzymasz dwa pierwsze znaki (indeksowane od 0 i 1) ciągu wejściowego.

[ "${1:0:2}" != $rowArgName ]I [ "${1:0:2}" != $colArgName ]sprawdzają, czy subtring wyjściowa jest równa niektórych innych ciągów.

heemayl
źródło
1
Zasadniczo sprawdza, czy użytkownik dostarczył 1 $ z -club -r, które prawdopodobnie lepiej zostały zaimplementowane zgetopts
Sergiy Kolodyazhnyy 12.04.16
15

Mały wyciąg z man bash:

$ {parametr: offset: długość}

Rozbudowa podciągów . Rozwija się do lengthznaków o wartości parameterzaczynającej się od znaku określonego przez offset. Jeśli parametrem jest @tablica indeksowana indeksowana przez @lub *lub nazwa tablicy asocjacyjnej, wyniki różnią się, jak opisano poniżej. Jeśli lengthzostanie pominięty, rozwija się do podłańcucha wartości parameterrozpoczynającej się od znaku określonego przez offset i rozciągającego się na koniec wartości. length i offset są wyrażeniami arytmetycznymi (patrz OCENA ARYTMETYCZNA poniżej).

Ralph Rönnquist
źródło
5

Jest to prosta ekstrakcja substratu ze zmiennej. Ta zmienna jest pierwszym parametrem skryptu (którym jest 1).

Jeśli mam zmienną FOO, widzę pierwsze dwa znaki jej wartości ${FOO:0:2}. To samo dzieje się w twoim przykładzie z pierwszym argumentem.

DopeGhoti
źródło