Shell = 변수가 #으로 시작하는지 확인


16

변수의 내용이 해시 기호로 시작하는지 확인하는 방법, 알아내는 방법을 알려 주시면 감사하겠습니다.

#!bin/sh    

myvar="#comment asfasfasdf"

if [ myvar = #* ] 

이 작동하지 않습니다.

감사!

얀스


1
"댓글"을 테스트 할 때 해시 태그 앞에 공백이있을 가능성을 고려할 것 입니다. 실제로 수행중인 작업입니다.
rthomson

bash솔루션과 관련된 답변을 수락 하면 sh/ dash솔루션을 원한다는 것을 암시하여 질문을 편집 할 수 있습니다.
찰스 로베르토 Canato

#!줄 의 절대 경로를 해당 줄의 상대 경로로 사용하는 것이 좋습니다 . 스크립트가있는 위치가 아니라 스크립트를 실행하는 프로세스의 현재 디렉토리를 기준으로합니다.
kasperd

답변:


20

해시이스케이프 하면 원래의 접근 방식이 제대로 작동 합니다 .

$ [[ '#snort' == \#* ]]; echo $?
0

또 다른 방법은 "하위 문자열 확장"을 사용하여 변수 내용의 첫 문자를 잘라내는 것입니다.

if [[ ${x:0:1} == '#' ]]
then
    echo 'yep'
else
    echo 'nope'
fi

yep

Bash 매뉴얼 페이지에서 :

   ${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.

이 매뉴얼 페이지를 보려면 man 무엇을 입력해야합니까?
duleshi

Bash 매뉴얼 페이지이므로 " man bash"해야합니다.
Insyte

2
그것은 bashism이지만 태그는 "bash"가 아닌 "shell"에 관한 것입니다 :(.
pevik

11

POSIX 호환 버전 :

[ "${var%${var#?}}"x = '#x' ] && echo yes

또는:

[ "${var#\#}"x != "${var}x" ] && echo yes

또는:

case "$var" in
    \#*) echo yes ;;
    *) echo no ;;
esac

1
posix 답변의 경우 +1 일부 기본 타이밍 테스트에서이 case방법은 상당히 오래된 32 비트 x86 컴퓨터에서이 중 가장 빠른 것으로 보입니다. 세 가지 모두 다음과 같은 포크 형 stdin 프로세서에 파이프하는 간단한 예보다 훨씬 효율적 echo $var | cut -c1입니다. 내 분석은 하나의 컴퓨터 / OS에서 10,000,000 회 반복-YMMV를 기반으로 매우 기본적이었습니다. 나는 그 느린 컴퓨터를 사용하여 차이점을 과장하고 적어도 하나의 플랫폼에서 더 잘 보이도록 만들었습니다.
Juan

BTW는 10,000,000 회 반복에 대해이 답변에 설명 된 내장 방법이 약 1 분 안에 실행되었습니다 (위의 느린 상자에서). cut맛 을 내는 파이프 는 5 시간 이상 걸렸습니다.
Juan

"
Justin

5

나는 이것이 이단 적이라는 것을 알고 있지만, 이런 종류의 것들에 대해서는 껍질 안에서 그것을하기보다는 grep이나 egrep을 사용하고 싶습니다. 조금 더 비싸지 만 (제 생각에는)이 솔루션의 가독성은 상쇄됩니다. 물론 개인적인 취향의 문제입니다.

그래서:

myvar="   #comment asfasfasdf"
if ! echo $myvar | egrep -q '^ *#'
then
  echo "not a comment"
else
  echo "commented out"
fi

선행 공백의 유무에 관계없이 작동합니다. 선행 탭도 설명하려면 대신 egrep -q '^ [\ t] * #'를 사용하십시오.


나는 정규 표현식을 좋아하기 때문에 egrep을 선호하지만 grep / egrep이 더 광범위한 상황에서 유용하다고 생각합니다.
Eduardo Ivanec

0

다른 방법이 있습니다 ...

# assign to var the value of argument actual invocation
var=${1-"#default string"}

if [[ "$var" == "#"* ]]
then
  echo "$var starts with a #"
fi

콘텐츠를 파일에 복사하여 붙여 넣기하고 실행 권한을 부여한 다음 작동 방식을 확인하십시오.

그것이 도움이되기를 바랍니다!

인사말.


1
그것은 bashism이지만 태그는 "bash"가 아닌 "shell"에 관한 것입니다 :(.
pevik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.