2012-01-19 15 views
37

estoy tratando de recuperar los 5 primeros caracteres de una cadena y pero obtengo un error de Bad substitution para la línea de manipulación de cadenas, he las siguientes líneas en mi guión teststring.sh:¿Intenta recuperar los primeros 5 caracteres de la cadena en error de bash?

TESTSTRINGONE="MOTEST" 

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

He fue por arriba del sintaxis muchas veces y no puede ver lo que estoy haciendo mal

Gracias

+1

¿Ha tenido un poco de suerte? ¿Qué versión de bash estás usando? ('bash -version' o' bash -version', típicamente) –

+2

@Mo.También me gustaría animarlo a que acepte una respuesta a continuación o al menos darle algún comentario. La respuesta de Alex L es muy buena, ¡y definitivamente vale la pena tener puntos de Internet falsos! – Overbryd

Respuesta

30

trabaja aquí:

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

¿Qué shell estás usando?

+0

es muy extraño! Estoy usando bash –

+0

bien, funciona bien en el terminal pero da el error cuando lo ejecuto desde un script .sh –

+3

Tal vez tu script no sea ejecutado por bash sino por un shell menos capaz. –

43

Dependiendo de su cáscara, es posible que pueda utilizar la siguiente sintaxis:

expr substr $string $position $length 

Así que para su ejemplo:

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

Alternativamente,

echo 'MOTEST' | cut -c1-5 

o

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

Usted puede tratar de sed si se quiere -

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

Creo que te refieres a' sed 's/\ (. \ {5 \} \). */\ 1/'<<< $ TESTSTRINGONE' – potong

+0

Sí, mi cadena fue truncada para empezar. Lo actualizaré ... Gracias @potong –

+1

Es posible que desee editar el resultado también – potong

3

Esto podría funcionar para usted:

printf "%.5s" $TESTSTRINGONE 
1

Esa expansión de parámetros debería funcionar (¿qué versión de fiesta tienes)

Aquí hay otro enfoque:

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

Las subcadenas con ${variablename:0:5} son una característica bash, no disponible en las conchas básicas. ¿Estás seguro de que estás ejecutando esto bajo bash? Verifique la línea shebang (al comienzo de la secuencia de comandos) y asegúrese de que sea #!/bin/bash, no #!/bin/sh.

+0

Era uno de Lo primero que intenté fue dar el mismo error. –

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

echo 'mystring' |cut -c1-5 es una solución alternativa a su problema.

más en unix cut program

1

La sintaxis original, trabajará con BASH pero no con DASH. En los sistemas Debian, es posible que piense que está utilizando bash, pero tal vez salga corriendo. Si/bin/dash/exist then intente cambiar temporalmente el nombre de dash a algo como no.dash, y luego cree un enlace suave , también conocido como ln -s/bin/bash/bin/dash y vea si eso soluciona el problema.

2

Trabaja en la mayoría de los proyectiles

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

Hasta que POSIX acepte bashisms, +1 para la portabilidad (aunque el título de este hilo especificó bash). Me gusta ver este tipo de respuestas para crear conciencia de que todo el mundo no es nada. – Juan

Cuestiones relacionadas