2012-01-19 8 views
37

Próbuję odzyskać pierwsze 5 znaków z łańcucha i pojawia się komunikat błędu Bad substitution dla linii manipulacji ciąg, mam następujące linie w moim teststring.sh skryptu:Próbujesz pobrać pierwszych 5 znaków z ciągu w błędzie bash?

TESTSTRINGONE="MOTEST" 

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

ja przeszedłem składnia wiele razy i mogę zobaczyć, co robię źle

Dzięki

+1

miałeś szczęścia? Z jakiej wersji bash korzystasz? ('bash -version' lub' bash --version', zwykle) –

+2

@Mo.Chciałbym również zachęcić cię do zaakceptowania odpowiedzi poniżej lub przynajmniej udzielenia opinii. Odpowiedź Alexa L jest bardzo dobra imho, a zdecydowanie warta jest fałszywych punktów internetowych! – Overbryd

Odpowiedz

30

tu pracuje:

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

Jaką powłokę używasz?

+0

to bardzo dziwne! Używam bash –

+0

ok, działa dobrze w terminalu, ale daje błąd, gdy uruchomię go ze skryptu .sh –

+3

Może twój skrypt nie jest wykonywany przez bash, ale przez mniejszą w stanie powłoki. –

43

zależności od powłoki, może być w stanie wykorzystać następującą składnię:

expr substr $string $position $length 

Tak dla przykładu:

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

Alternatywnie

echo 'MOTEST' | cut -c1-5 

lub

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

Można spróbować sed jeśli chcesz -

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

Myślę, że masz na myśli' sed 's/\ (. \ {5 \} \). */\ 1/'<<< $ TESTSTRINGONE' – potong

+0

Tak, mój ciąg został skrócony na początek. Zły zaktualizuję go ... Dzięki @potong –

+1

Możesz również edytować wynik też – potong

3

To może pracować dla Ciebie:

printf "%.5s" $TESTSTRINGONE 
1

że ekspansja parametr powinien działać (? Jaka wersja bash masz)

Oto inne podejście:

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

Podłoża z ${variablename:0:5} to funkcja bash, niedostępna w podstawowych powłokach. Czy na pewno używasz tego w bash? Sprawdź linię Shebang (na początku skryptu) i upewnij się, że jest to #!/bin/bash, a nie #!/bin/sh.

+0

To był jeden z pierwsze rzeczy, które wypróbowałem, nadal daje ten sam błąd. –

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

echo 'mystring' |cut -c1-5 to alternatywne rozwiązanie problemu ur.

więcej na unix cut program

1

Oryginalny składnia będzie współpracować z BASH ale nie z DASH. W systemach debian możesz pomyśleć, że używasz bash, ale może zamiast tego zamiast tego. Jeśli istnieje/bin/dash /, to spróbuj tymczasowo zmienić nazwę myślnika na coś podobnego do no.dash, a następnie utwórz miękkie łącze , a także ln -s/bin/bash/bin/dash i zobacz, czy to rozwiąże problem.

2

Prace w większości powłok

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

Dopóki bashisms nie zostaną zaakceptowane przez POSIX, +1 do przenoszenia (nawet jeśli tytuł tego wątku jest określony jako bash). Lubię zobaczyć tego rodzaju odpowiedzi, aby podnieść świadomość, że cały świat nie jest bash. – Juan

Powiązane problemy