[ "${1:0:1}" = '-' ] 의미

[ "${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은 무엇을 의미합니까?

답변1

-분명히 이것은 점으로 구분된 매개변수 옵션에 대한 테스트입니다. 사실 좀 이상해요. 비표준 bash확장을 사용하여 첫 번째 문자와 첫 번째 문자만 추출하려고 합니다 $1. 0헤더 문자 인덱스이고 문자열 1길이입니다. [ test비슷한 상황 에서는 다음과 같을 수도 있습니다.

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

그러나 두 비교 모두 점선 인수도 해석하므로 특히 적합하지 않습니다. 이것이 바로 제가 거기에서 선행 공백을 사용하는 이유입니다 test.-

이런 종류의 작업을 수행하는 가장 좋은 방법과 일반적으로 수행되는 방식은 다음과 같습니다.

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

답변2

$1문자 0부터 문자 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.

답변3

첫 번째 매개변수의 첫 번째 문자가 $1대시인지 테스트하고 있습니다 -.

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

이는 다음을 의미합니다.

  • name: 명명된 매개변수 1, 즉:$1
  • 시작: 첫 번째 문자부터 시작합니다 0(번호는 0부터 시작).
  • 길이: 1자.

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


테스트 라인을 변경하려면:

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

배쉬 옵션

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

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

참조 문제가 없으므로 더 안전합니다(내부적으로 분할이 수행되지 않음 [[).

POSIX 옵션.

오래되고 덜 강력한 쉘의 경우 다음과 같이 변경할 수 있습니다.

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

오직 case 명령만이 잘못된 참조에 더 강합니다.

관련 정보