저는 UNIX에서 문자열의 첫 번째 문자가 "/"인지 확인해야하는 스크립트를 작성하고 있고, 그렇다면 분기입니다.
예를 들어 문자열이 있습니다.
/some/directory/file
나는 이것이 1을 반환하고 싶습니다.
server@10.200.200.20:/some/directory/file
0을 반환합니다.
답변:
이를 수행하는 다양한 방법. 이중 괄호 안에 와일드 카드를 사용할 수 있습니다.
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
${str::1}
.
대부분의 sh 기반 쉘과 호환되는 case 문도 고려하십시오.
case $str in
/*)
echo 1
;;
*)
echo 0
;;
esac
*
만 결코 슬래시를 통해, 단일 경로 구성 요소를 일치/
#
하려면 따옴표를 사용해야합니다. 예 : '#'*) echo "found comment";;
.
$ 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
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
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
공백이 제거 되기 때문 일까요?
echo
는 이스케이프에 대한 구현 정의 동작을 가지고 있습니다. stackoverflow.com/questions/8467424/…