Ich schreibe ein Skript unter UNIX, in dem ich überprüfen muss, ob das erste Zeichen in einer Zeichenfolge "/" ist, und wenn ja, verzweigen.
Zum Beispiel habe ich eine Zeichenfolge:
/some/directory/file
Ich möchte, dass dies 1 zurückgibt und:
[email protected]:/some/directory/file
0 zurückgeben.
Antworten:
Viele Möglichkeiten, dies zu tun. Sie können Platzhalter in doppelten Klammern verwenden:
str="/some/directory/file" if [[ $str == /* ]]; then echo 1; else echo 0; fi
Sie können die Teilzeichenfolgenerweiterung verwenden:
if [[ ${str:0:1} == "/" ]] ; then echo 1; else echo 0; fi
Oder eine Regex:
if [[ $str =~ ^/ ]]; then echo 1; else echo 0; fi
quelle
${str::1}
.Betrachten Sie auch die case-Anweisung, die mit den meisten sh-basierten Shells kompatibel ist:
case $str in /*) echo 1 ;; *) echo 0 ;; esac
quelle
*
passt nur zu einer einzelnen Pfadkomponente, niemals über Schrägstriche hinweg/
#
Sie Anführungszeichen verwenden. Zum Beispiel :'#'*) echo "found comment";;
.$ 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
quelle
foo='*'; [ ${foo:0:1} == "/" ] && echo 1 || echo 0
wird diesen Fehler ausgebenbash: [: too many arguments
. Verwenden Sie[ "${foo:0:1}" == "/" ] && echo 1 || echo 0
oder noch besser[[ ${foo:0:1} == "/" ]] && echo 1 || echo 0
cut -c1
Dies ist POSIX und
case
extrahiert im Gegensatz zum eigentlichen Zeichen das erste Zeichen, wenn Sie es für später benötigen: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
ist eine andere POSIX, aber weniger effiziente Alternative:printf '%s' "$myvar" | awk '{print substr ($0, 0, 1)}'
printf '%s'
Um Probleme mit Escape-Zeichen zu vermeiden: https://stackoverflow.com/a/40423558/895245 Beispiel:myvar='\n' printf '%s' "$myvar" | cut -c1
Ausgänge
\
wie erwartet.${::}
scheint nicht POSIX zu sein.Siehe auch: Wie extrahiere ich die ersten beiden Zeichen einer Zeichenfolge in Shell-Skripten?
quelle
printf
? Wäre das, weilecho
Leerzeichen entfernt würden?echo
hat ein von der Implementierung definiertes Verhalten bei