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