[unix] [“$ {1 : 0 : 1}”= ‘-‘]의 의미

MySQL 프로세스를 시작하기 위해 다음 스크립트가 있습니다.

if [ "${1:0:1}" = '-' ]; then
    set -- mysqld_safe "$@"
fi

if [ "$1" = 'mysqld_safe' ]; then
    DATADIR="/var/lib/mysql"
...

이 맥락에서 1 : 0 : 1은 무엇을 의미합니까?



답변

-분명히 파선 인수 옵션에 대한 테스트입니다 . 정말 조금 이상합니다. bash에서 첫 번째 문자와 첫 번째 문자 만 추출하기 위해 비표준 확장을 사용합니다 $1. 는 0머리 문자 인덱스이며,이 1문자열의 길이입니다. 마찬가지로 다음 [ test과 같이 될 수도 있습니다.

[ " -${1#?}" = " $1" ]

대시 비교도 test마찬가지로 해석 하기에 적합하지 않습니다 -. 따라서 선행 공간을 사용합니다.

이런 종류의 작업을 수행하는 가장 좋은 방법은 다음과 같습니다.

case $1 in -*) mysqld_safe "$@"; esac


답변

이것은 $10에서 1 번째 문자 의 부분 문자열을 가져옵니다. 따라서 문자열의 첫 번째 문자와 첫 번째 문자 만 가져옵니다.

로부터 bash3.2 매뉴얼 페이지

  ${parameter:offset}
  ${parameter:offset:length}
          Substring  Expansion.   Expands  to  up to length characters of
          parameter starting at the character specified  by  offset.   If
          length is omitted, expands to the substring of parameter start-
          ing at the character specified by offset.   length  and  offset
          are  arithmetic  expressions (see ARITHMETIC EVALUATION below).
          length must evaluate to a number greater than or equal to zero.
          If  offset  evaluates  to a number less than zero, the value is
          used as an offset from the end of the value of  parameter.   If
          parameter  is  @,  the  result  is length positional parameters
          beginning at offset.  If parameter is an array name indexed  by
          @ or *, the result is the length members of the array beginning
          with ${parameter[offset]}.  A negative offset is taken relative
          to  one  greater than the maximum index of the specified array.
          Note that a negative offset must be separated from the colon by
          at  least  one space to avoid being confused with the :- expan-
          sion.  Substring indexing is zero-based unless  the  positional
          parameters are used, in which case the indexing starts at 1.

답변

첫 번째 인수의 첫 문자 $1가 대시 인지 테스트 중입니다 -.

1 : 0 : 1은 매개 변수 확장 값입니다 ${parameter:offset:length}.

그것의 의미는:

  • 이름 :이라는 매개 변수 1, 즉 :$1
  • 시작 : 첫 문자부터 시작합니다 0(0부터 번호가 매겨 짐).
  • 길이 : 1 자

간단히 말해서 : 첫 번째 위치 매개 변수의 첫 문자 $1.
이 매개 변수 확장은 ksh, bash, zsh (적어도)에서 사용할 수 있습니다.


테스트 라인을 변경하려는 경우 :

[ "${1:0:1}" = "-" ]

배쉬 옵션

다른 안전한 bash 솔루션은 다음과 같습니다.

[[ $1 =~ ^- ]]
[[ $1 == -* ]]

인용에 문제가 없기 때문에 더 안전합니다 (내에서 분할이 실행되지 않음 [[)

POSIXly 옵션.

오래되고 능력이 떨어지는 구형 쉘의 경우 다음과 같이 변경할 수 있습니다.

[ "$(echo $1 | cut -c 1)" = "-" ]
[ "${1%%"${1#?}"}"        = "-" ]
case $1 in  -*) set -- mysqld_safe "$@";; esac

case 명령 만 잘못된 인용에 더 강합니다.


답변