Hoe kan ik het eerste teken in een string in Bash- of Unix-shell controleren?

Ik schrijf een script in Unix waarbij ik moet controleren of het eerste teken in een string “/” is en zo ja, branch.

Ik heb bijvoorbeeld een string:

/some/directory/file

Ik wil dat dit 1 retourneert en:

[email protected]:/some/directory/file

om 0 terug te geven.


Antwoord 1, autoriteit 100%

Er zijn veel manieren om dit te doen. U kunt jokertekens tussen dubbele haakjes gebruiken:

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

U kunt subtekenreeksuitbreiding gebruiken:

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

Of een regex:

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

Antwoord 2, autoriteit 12%

Beschouw ook de case-statement die compatibel is met de meeste sh-gebaseerde shells:

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

Antwoord 3, autoriteit 7%

$ foo="/some/directory/file"
$ [ ${foo:0:1} == "/" ] && echo 1 || echo 0
1
$ foo="[email protected]:/some/directory/file"
$ [ ${foo:0:1} == "/" ] && echo 1 || echo 0
0

Antwoord 4, autoriteit 4%

cut -c1

Dit is POSIX, en in tegenstelling tot case, extraheert het eigenlijk het eerste teken als je heb het nodig voor later:

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 substris een ander POSIX-commando, maar minder efficiënt alternatief:

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

printf '%s'is om problemen met escape-tekens te voorkomen: Bash printf letterlijke woordelijke tekenreeks, bijv.

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

voert \uit zoals verwacht.

${::}lijkt geen POSIX te zijn.

Zie ook: Hoe kan ik de eerste twee tekens van een tekenreeks in shellscripting?

Other episodes