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

Mo.
quelle
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)}'
Alex L.
quelle
65

echo 'mystring' |cut -c1-5 ist eine alternative Lösung für Ihr Problem.

mehr zum unix cut programm

Balaswamy Vaddeman
quelle
51

Funktioniert hier:

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

Welche Shell benutzt du?


quelle
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.

Gordon Davisson
quelle
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
Potong
quelle
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
Lauri
quelle
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
jaypal singh
quelle
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
amc
quelle
1

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

Hier ist ein anderer Ansatz:

read -n 5 NEWTESTSTRING <<< "$TESTSTRINGONE"
Glenn Jackman
quelle
1
echo $TESTSTRINGONE|awk '{print substr($0,0,5)}'
Vijay
quelle
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.

Wiley
quelle