Versuchen Sie, die ersten 5 Zeichen aus der Zeichenfolge in einem Bash-Fehler abzurufen?


75

Ich versuche, die ersten 5 Zeichen aus einer Zeichenfolge abzurufen, erhalte jedoch weiterhin einen Bad substitutionFehler für die Zeichenfolgenmanipulationszeile. Ich habe die folgenden Zeilen in meinem teststring.shSkript:

TESTSTRINGONE="MOTEST"

NEWTESTSTRING=${TESTSTRINGONE:0:5}
echo ${NEWTESTSTRING}

Ich habe die Syntax viele Male durchgesehen und kann nicht sehen, was ich falsch mache

Vielen Dank


1
Hast du Glück gehabt? Welche Version von Bash verwenden Sie? ( bash -versionoder bash --versionnormalerweise)
Alex L

4
@Mo. Ich möchte Sie auch ermutigen, eine Antwort unten anzunehmen oder zumindest ein Feedback zu geben. Die Antwort von Alex L ist imho sehr gut und es ist definitiv einige gefälschte Internetpunkte wert!
Overbryd

Antworten:


66

Abhängig von Ihrer Shell können Sie möglicherweise die folgende Syntax verwenden:

expr substr $string $position $length

Also für Ihr Beispiel:

TESTSTRINGONE="MOTEST"
echo `expr substr ${TESTSTRINGONE} 0 5`

Alternative,

echo 'MOTEST' | cut -c1-5

oder

echo 'MOTEST' | awk '{print substr($0,0,5)}'


51

Funktioniert hier:

$ TESTSTRINGONE="MOTEST"
$ NEWTESTSTRING=${TESTSTRINGONE:0:5}
$ echo ${NEWTESTSTRING}
MOTES

Welche Shell benutzt du?


ok, es funktioniert gut im Terminal, aber es gibt den Fehler, wenn ich es aus einem .sh-Skript ausführen
Mo.

5
Möglicherweise wird Ihr Skript nicht von bash ausgeführt, sondern von einer weniger leistungsfähigen Shell.

4
Haben Sie versucht, #!/bin/bashoder #!/bin/shzu Ihrer ersten Zeile hinzuzufügen ?
Alex L

1
Ich wette .shoder #!/bin/shaktiviere den "POSIX Compliance Mode" von Bash. Da diese Form des String-Slicing keine POSIX-Shell-Funktion ist (es ist eine Bash-Funktion), geht diese verloren. Versuchen Sie explizit auf die oberste Zeile Einstellung #!/bin/bash, nicht sh .
Zac B

1
Welche Version von Bash verwenden Sie? Bash <4 fehlt viele gute Sachen
Sibaz

13

Teilzeichenfolgen mit ${variablename:0:5}sind eine Bash-Funktion, die in Basisschalen nicht verfügbar ist. Sind Sie sicher, dass Sie dies unter Bash ausführen? Überprüfen Sie die Shebang-Zeile (am Anfang des Skripts) und stellen Sie sicher, dass dies #!/bin/bashnicht der Fall ist #!/bin/sh. Und stellen Sie sicher, dass Sie es nicht mit dem shBefehl (dh sh scriptname) ausführen , da dies den Shebang überschreibt.


Es war eines der ersten Dinge, die ich versucht habe, es gibt immer noch den gleichen Fehler.
Mo.

7

Dies könnte für Sie funktionieren:

 printf "%.5s" $TESTSTRINGONE

Ist das POSIX? Probleme beim Durchsuchen der printfPOSIX-Seite des Dienstprogramms
Harold Fischer

6

Funktioniert in den meisten Muscheln

TESTSTRINGONE="MOTEST"
NEWTESTSTRING=${TESTSTRINGONE%"${TESTSTRINGONE#?????}"}
echo ${NEWTESTSTRING}
# MOTES

1
Bis Bashismen von POSIX akzeptiert werden, +1 für die Portabilität (obwohl der Titel dieses Threads Bash angegeben hat). Ich mag es, solche Antworten zu sehen, um das Bewusstsein dafür zu schärfen, dass die ganze Welt nicht verprügelt ist.
Juan

2

Sie können versuchen, sedwenn Sie möchten -

[jaypal:~/Temp] TESTSTRINGONE="MOTEST"
[jaypal:~/Temp] sed 's/\(.\{5\}\).*/\1/' <<< "$TESTSTRINGONE"
MOTES

Ich denke du meinstsed 's/\(.\{5\}\).*/\1/' <<<$TESTSTRINGONE
Potong

Ja, meine Saite wurde von Anfang an abgeschnitten. Ich
werde

2

Du warst so nah! Hier ist die einfachste Lösung:NEWTESTSTRING=$(echo ${TESTSTRINGONE::5})

Also für Ihr Beispiel:

$ TESTSTRINGONE="MOTEST"
$ NEWTESTSTRING=$(echo ${TESTSTRINGONE::5})
$ echo $NEWTESTSTRING
MOTES

1

Diese Parametererweiterung sollte funktionieren (welche Version von Bash haben Sie?)

Hier ist ein anderer Ansatz:

read -n 5 NEWTESTSTRING <<< "$TESTSTRINGONE"

1
echo $TESTSTRINGONE|awk '{print substr($0,0,5)}'

1

Die ursprüngliche Syntax funktioniert mit BASH, jedoch nicht mit DASH. Auf Debian-Systemen denken Sie vielleicht, Sie verwenden Bash, aber vielleicht stattdessen Dash. Wenn / bin / dash / exist ist, versuchen Sie, dash vorübergehend in no.dash umzubenennen, und erstellen Sie dann einen weichen Link, auch bekannt als ln -s / bin / bash / bin / dash, und prüfen Sie, ob das Problem dadurch behoben wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.