web-dev-qa-db-fra.com

Comment vérifier le premier caractère d'une chaîne dans un shell Bash ou UNIX?

J'écris un script sous UNIX où je dois vérifier si le premier caractère d'une chaîne est "/" et si c'est le cas, branche.

Par exemple, j'ai une chaîne:

/some/directory/file

Je veux que cela retourne 1, et:

[email protected]:/some/directory/file

pour retourner 0.

60
canecse

De nombreuses façons de faire cela. Vous pouvez utiliser des jokers entre doubles crochets:

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

Vous pouvez utiliser l'expansion de la sous-chaîne:

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

Ou une regex:

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

Considérez également la déclaration de cas compatible avec la plupart des coques à base de sh:

case "$STRING" in
/*)
    echo 1
    ;;
*)
    echo 0
    ;;
esac
14
konsolebox
$ 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
9
devnull

cut -c1

Ceci est POSIX, et contrairement à case extrait le premier caractère si vous en avez besoin pour plus tard:

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 est une autre alternative POSIX mais moins efficace:

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

printf '%s' _ pour éviter les problèmes de caractères d'échappement: https://stackoverflow.com/a/40423558/895245 e.g .:

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

les sorties \ comme prévu.

${::} ne semble pas être POSIX.

Voir aussi: Comment extraire les deux premiers caractères d'une chaîne dans un script shell?