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까지의 하위 문자열을 사용합니다 . 따라서 문자열의 첫 번째 문자와 첫 번째 문자만 얻게 됩니다.
bash
3.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 명령만이 잘못된 참조에 더 강합니다.