Bash 또는 UNIX 쉘에서 문자열의 첫 번째 문자를 확인하는 방법은 무엇입니까?


78

저는 UNIX에서 문자열의 첫 번째 문자가 "/"인지 확인해야하는 스크립트를 작성하고 있고, 그렇다면 분기입니다.

예를 들어 문자열이 있습니다.

/some/directory/file

나는 이것이 1을 반환하고 싶습니다.

server@10.200.200.20:/some/directory/file

0을 반환합니다.


답변:


140

이를 수행하는 다양한 방법. 이중 괄호 안에 와일드 카드를 사용할 수 있습니다.

str="/some/directory/file"
if [[ $str == /* ]]; then echo 1; else echo 0; fi

하위 문자열 확장을 사용할 수 있습니다.

if [[ ${str:0:1} == "/" ]] ; then echo 1; else echo 0; fi

또는 정규식 :

if [[ $str =~ ^/ ]]; then echo 1; else echo 0; fi

16
간단히 말해 : ${str::1}.
kenorb

16

대부분의 sh 기반 쉘과 호환되는 case 문도 고려하십시오.

case $str in
/*)
    echo 1
    ;;
*)
    echo 0
    ;;
esac

1
나는 글로브 생각 *만 결코 슬래시를 통해, 단일 경로 구성 요소를 일치/
user1011471

1
관련 POSIX 인용문은 다음과 같습니다. pubs.opengroup.org/onlinepubs/9699919799/utilities/… "Case Conditional Construct"문장 "여러 패턴 중 첫 번째 패턴에 해당 (패턴 일치 표기 참조)"
Ciro Santilli 郝海东 冠状 病 六四 事件法轮功

1
또한 일치 #하려면 따옴표를 사용해야합니다. 예 : '#'*) echo "found comment";;.
Alexis Wilke

10
$ foo="/some/directory/file"
$ [ ${foo:0:1} == "/" ] && echo 1 || echo 0
1
$ foo="server@10.200.200.20:/some/directory/file"
$ [ ${foo:0:1} == "/" ] && echo 1 || echo 0
0

5
반대 투표! 변수를 단일 중괄호로 인용하는 것을 잊었습니다. foo='*'; [ ${foo:0:1} == "/" ] && echo 1 || echo 0이 오류를 출력합니다 bash: [: too many arguments. 사용 [ "${foo:0:1}" == "/" ] && echo 1 || echo 0또는 그 이상[[ ${foo:0:1} == "/" ]] && echo 1 || echo 0
Aleks-Daniel Jakimenko-A.

@ Aleks-DanielJakimenko-A. -devnull의 답변은 "GNU bash, 버전 4.3.48 (1) -release (x86_64-pc-linux-gnu) Copyright (C) 2013 Free Software Foundation, Inc."에서 오류없이 작동합니다.
Craig Hicks 2018

초기 표현 : "비감! 변수를 중괄호로 인용하는 것을 잊었습니다." devnulls 답변에 입력 된 표현식이 bash 에서처럼 작동하지 않음을 의미합니다. 기술적 포인트를 제대로 전달하려면 초기 표현을 수정해야합니다. 그렇지 않으면 논리적으로 올바르지 않습니다.
Craig Hicks

1
@ Aleks-DanielJakimenko-A. 오타에 반대 투표 하시겠습니까? 정말?
Mausy5043

2
@ Mausy5043 "오타"가 아니며 버그가 많고 잘못되었습니다.
Aleks-Daniel Jakimenko-A.

5

cut -c1

이것은 POSIX이며 case나중에 필요할 경우 실제로 첫 번째 문자를 추출하는 것과는 다릅니다 .

myvar=abc
first_char="$(printf '%s' "$myvar" | cut -c1)"
if [ "$first_char" = a ]; then
  echo 'starts with a'
else
  echo 'does not start with a'
fi

awk substr 또 다른 POSIX이지만 덜 효율적인 대안입니다.

printf '%s' "$myvar" | awk '{print substr ($0, 0, 1)}'

printf '%s'이스케이프 문자 문제를 방지하는 것입니다 : https://stackoverflow.com/a/40423558/895245 예 :

myvar='\n'
printf '%s' "$myvar" | cut -c1

\예상대로 출력 됩니다.

${::} POSIX가 아닌 것 같습니다.

참조 : 쉘 스크립팅에서 문자열의 처음 두 문자를 추출하는 방법은 무엇입니까?


printf? echo공백이 제거 되기 때문 일까요?
Alexis Wilke

@AlexisWilke echo는 이스케이프에 대한 구현 정의 동작을 가지고 있습니다. stackoverflow.com/questions/8467424/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.