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


18

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

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

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

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


1
나는 그 대답을 정말로 알고 싶지만 이것이 SF에 대해 너무 좁은 질문이라고 생각합니다. 유닉스 사이트로 마이그레이션하기로 결정했습니다.
Massimo

답변:


19

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

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

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

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

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

1
닫기; 두 번째 콜론 뒤의 숫자 ${1:0:1}는 길이가 아니라 인덱스입니다.
chepner

bashism 방식으로 [[: [[ $1 == -* ]].
Arthur2e5

2
개인적으로 나는 이것이 여기에 -문제가 될 것이라고 생각하지 않습니다 test. POSIX 는 인수 수로 의미의 정의를 제공합니다. 두 개의 인수를 취하는 그러한 옵션은 없으므로 원시로 작성하는 것이 안전해야합니다.
Arthur2e5

@ Arthur2e5-당신 말이 맞아요-그들은 문제가되어서는 안되며 전혀 문제가되지 않습니다. 그것은 여전히가는 이상한 방법입니다. 잘 맞지 않습니다. 무엇을 [[ : [[합니까?
mikeserv

1
@mikeserv 글을 다른 곳에서 읽어 보면 웹 페이지를 봐야합니다. 제 의견은 'START_CODE [[END_CODE : START_CODE [[$ 1 ==-*]] END_CODE'와 같습니다. 첫 번째 [[는 구문 이름이고 콜론은 문장 부호입니다.
Arthur2e5

11

이것은 $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.

6

첫 번째 인수의 첫 문자 $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 명령 만 잘못된 인용에 더 강합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.