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 substr
is 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?