Ich versuche, die ersten 5 Zeichen aus einer Zeichenfolge abzurufen, erhalte jedoch weiterhin einen Bad substitution
Fehler für die Zeichenfolgenmanipulationszeile. Ich habe die folgenden Zeilen in meinem teststring.sh
Skript:
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
bash -version
oderbash --version
normalerweise)Antworten:
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)}'
quelle
echo 'mystring' |cut -c1-5
ist eine alternative Lösung für Ihr Problem.mehr zum unix cut programm
quelle
Funktioniert hier:
$ TESTSTRINGONE="MOTEST" $ NEWTESTSTRING=${TESTSTRINGONE:0:5} $ echo ${NEWTESTSTRING} MOTES
Welche Shell benutzt du?
quelle
#!/bin/bash
oder#!/bin/sh
zu Ihrer ersten Zeile hinzuzufügen ?.sh
oder#!/bin/sh
aktiviere 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
, nichtsh
.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/bash
nicht der Fall ist#!/bin/sh
. Und stellen Sie sicher, dass Sie es nicht mit demsh
Befehl (dhsh scriptname
) ausführen , da dies den Shebang überschreibt.quelle
Dies könnte für Sie funktionieren:
printf "%.5s" $TESTSTRINGONE
quelle
printf
POSIX-Seite des DienstprogrammsFunktioniert in den meisten Muscheln
TESTSTRINGONE="MOTEST" NEWTESTSTRING=${TESTSTRINGONE%"${TESTSTRINGONE#?????}"} echo ${NEWTESTSTRING} # MOTES
quelle
Sie können versuchen,
sed
wenn Sie möchten -[jaypal:~/Temp] TESTSTRINGONE="MOTEST" [jaypal:~/Temp] sed 's/\(.\{5\}\).*/\1/' <<< "$TESTSTRINGONE" MOTES
quelle
sed 's/\(.\{5\}\).*/\1/' <<<$TESTSTRINGONE
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
quelle
Diese Parametererweiterung sollte funktionieren (welche Version von Bash haben Sie?)
Hier ist ein anderer Ansatz:
read -n 5 NEWTESTSTRING <<< "$TESTSTRINGONE"
quelle
echo $TESTSTRINGONE|awk '{print substr($0,0,5)}'
quelle
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.
quelle