"${-#*i}" != "$-" 무슨 뜻인가요?

"${-#*i}" != "$-" 무슨 뜻인가요?

/etc/profile이것을 본 후 :

for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

무슨 뜻이에요 ${-#*i}. 매개변수 확장의 정의를 찾을 수 없습니다 ${-.

답변1

$-호출되거나 내장 명령을 사용할 때 쉘 자체 set에 의해 설정된 현재 옵션 플래그는 다음과 같습니다.

$ echo $-
himBH
$ set -a
$ echo $-
ahimBH

"${-#*i}"문자열 삭제 구문은 다음과 같습니다.POSIX 문서)

${매개변수#[단어]}

최소 접두사 패턴을 제거합니다. 패턴을 생성하려면 단어를 확장해야 합니다. 그런 다음 매개변수 확장을 통해 접두사의 최소 부분이 제거된 패턴과 일치하는 매개변수를 생성해야 합니다. 존재하는 경우 해당 단어는 따옴표가 없는 "#"으로 시작해서는 안 됩니다.

${매개변수##[단어]}

최대 접두사 패턴을 제거합니다. 패턴을 생성하려면 단어를 확장해야 합니다. 그런 다음 매개변수 확장을 통해 접두사의 가장 큰 부분이 제거된 패턴과 일치하는 매개변수를 생성해야 합니다.

따라서 ${-#*i}첫 번째 i문자까지 가장 짧은 문자열을 제거하십시오.

$ echo "${-#*i}"
mBH

귀하의 경우 if [ "${-#*i}" != "$-" ]쉘이 대화형인지 확인하십시오.

답변2

쉘 매개변수가 있습니다 $-. 나는:

$ echo $-
himB

${-}정확히 $-동일 ${foo}합니다 $foo.

#*i의미: 변수 값의 시작 부분부터 첫 번째 값까지(포함하여) 제거합니다(가능한 한 적게, 여기서는 차이 없음) i.

$ echo "${-#*i}"
mB

즉, 변수 값에 이 있는지 확인하십시오 [ "${-#*i}" != "$-" ]. 즉, 쉘이 대화형인지 확인하십시오.i$-

즉, 이는 복잡하고 Bourne과 호환되지 않는 작성 방식입니다.

case $- in
  *i*) ...;;
  *) ...;;
esac

관련 정보