저는 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
답변
대부분의 sh 기반 쉘과 호환되는 case 문도 고려하십시오.
case $str in
/*)
echo 1
;;
*)
echo 0
;;
esac
답변
$ 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
답변
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가 아닌 것 같습니다.