Pregunta

¿Cómo me hago eco de uno o más caracteres de tabulación utilizando un script bash? Cuando ejecuto el código

res='       'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]

Me sale este

res=[ x] # that is [<space>x]
¿Fue útil?

Solución

echo -e ' \t '

hará eco 'de nueva línea espacio de tabulación espacio' (-e significa 'permitir la interpretación de la barra invertida se escapa'):

$ echo -e ' \t ' | hexdump -C
00000000  20 09 20 0a                                       | . .|

Otros consejos

Uso printf, no echo.

Hay varias versiones diferentes de la orden echo. Hay /bin/echo (que puede o no ser la versión de GNU Coreutils, dependiendo del sistema), y el comando echo está integrado en la mayoría de los proyectiles. Diferentes versiones tienen diferentes maneras (o ninguna manera) para especificar o desactivar los escapes de los caracteres de control.

printf, por el contrario, tiene una variación mucho menor. Puede tratarse de un comando, típicamente /bin/printf, y está construido en algunas conchas (bash y zsh tienen, tcsh y ksh no lo hacen), pero las diferentes versiones son mucho más similares entre sí que las diferentes versiones de echo son. Y usted no tiene que recordar las opciones de línea de comandos (con algunas excepciones; Coreutils GNU printf acepta --version y --help, y la fiesta de printf incorporada acepta -v var para almacenar el resultado en una variable).

Para su ejemplo:

res='           'x # res = "\t\tx"
printf '%s\n' "[$res]"

Y ahora es el momento para mí admitir que echo funcionará igual de bien para el ejemplo que estás preguntando acerca; sólo tiene que poner comillas alrededor del argumento:

echo "[$res]"

como escribió kmkaplan (hace dos años y medio, me acabo de dar cuenta!). El problema con los comandos originales:

res='           'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]

no es con echo; es que la cáscara sustituyó a la pestaña con un espacio antes echo jamás vio.

echo está muy bien para la producción simple, como echo hello world, pero debería utilizar printf cada vez que desee hacer algo más complejo. Usted puede get echo a trabajar, pero el código resultante es probable que falle cuando se ejecuta con una aplicación diferente o echo un shell diferente.

Ponga la cadena entre :

echo "[$res]"

También puede probar:

echo Hello$'\t'world.

es necesario utilizar la opción -e para el eco continuación, puede

echo -e "\t\t x"

Desde la página de manual de bash:

  

Las palabras de la forma $ 'cadena' se tratan de forma especial. La palabra se expande para cadena, con personajes escapados reemplazados según lo especificado por el estándar ANSI C.

Así que usted puede hacer esto:

echo $'hello\tworld'

El uso de eco para imprimir los valores de las variables es una trampa Bash común. conexión de referencia:

http://mywiki.wooledge.org/BashPitfalls#echo_.24foo

Utilice la combinación de teclas pie de la letra, ^V (CTRL+V, C-v, lo ).

Al escribir ^V en el terminal (o en la mayoría de los editores de Unix), se toma el siguiente carácter textualmente . Usted puede usar esto para escribir un carácter literal pestaña dentro de una cadena que se están haciendo eco.

Algo así como las siguientes obras:

echo "^V<tab>"     # CTRL+V, TAB

Bash docs ( QV , "citado inserto")

  

citado inserto (C-q, C-v)   Añadir el siguiente carácter que escriba a la línea de pie de la letra. Esta es la forma de insertar secuencias de teclas como C-q, por ejemplo.

nota: de acuerdo con esto, ALT+TAB debería hacer lo mismo, pero todos hemos atados a esa secuencia ventana de cambio de modo que no podemos usarlo

  

ficha-inserto (M-TAB)   Insertar un carácter de tabulación.

-

Nota: se puede usar esta estrategia con todo tipo de personajes inusuales. Al igual que un retorno de carro:

echo "^V^M"        # CTRL+V, CTRL+M

Esto se debe a que el retorno de carro es ASCII 13, y M es la letra 13 del alfabeto, por lo que cuando se escribe ^M, se obtiene el carácter ASCII 13. Puede verlo en acción usando ls^M, en un indicador de vacío, que se insertará un retorno de carro, provocando el símbolo para actuar como usted golpea retorno. Cuando estos caracteres se interpretan normalmente, textualmente tiene Tienes el carácter literal.

Si desea utilizar echo "a\tb" en una secuencia de comandos, se ejecuta la secuencia de comandos como:

# sh -e myscript.sh

Como alternativa, se puede dar a myscript.sh el permiso de ejecución, y luego ejecutar el script.

# chmod +x myscript.sh
# ./myscript.sh
res="\t\tx"
echo -e "[${res}]"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top