programas - scripts bash ejemplos
Caracteres de la pestaƱa eco en el script bash (10)
Desde la página de manual de bash:
Las palabras de la forma $ ''cadena'' se tratan especialmente. La palabra se expande a la cadena, con caracteres de escape de barra invertida reemplazados según lo especificado por el estándar ANSI C.
Así que puedes hacer esto:
echo $''hello/tworld''
¿Cómo hago eco de uno o más caracteres de tabulación usando un script de bash? Cuando corro este codigo
res='' ''x # res = "/t/tx"
echo ''[''$res'']'' # expect [/t/tx]
entiendo esto
res=[ x] # that is [<space>x]
El uso de eco para imprimir valores de variables es un error común de Bash. Link de referencia:
Ponga su cadena entre comillas dobles :
echo "[$res]"
Si desea usar echo "a/tb"
en un script, ejecute el script como:
# sh -e myscript.sh
Alternativamente, puede otorgar a myscript.sh el permiso de ejecución y luego ejecutar el script.
# chmod +x myscript.sh
# ./myscript.sh
También puedes probar:
echo Hello$''/t''world.
Usa printf
, no echo
.
Existen múltiples versiones diferentes del comando echo
. Hay /bin/echo
(que puede ser o no la versión de GNU Coreutils, dependiendo del sistema), y el comando echo
está integrado en la mayoría de los shells. Diferentes versiones tienen diferentes maneras (o ninguna) de especificar o deshabilitar escapes para los caracteres de control.
printf
, por otro lado, tiene mucha menos variación. Puede existir como un comando, normalmente /bin/printf
, y está integrado en algunos shells (bash y zsh lo tienen, tcsh y ksh no), pero las diferentes versiones son mucho más similares entre sí que las diferentes versiones de echo
son Y no tiene que recordar las opciones de la línea de comandos (con algunas excepciones; GNU Coreutils printf acepta --version
y --help
, y el bash printf incorporado acepta -v var
para almacenar la salida en una variable).
Para su ejemplo:
res='' ''x # res = "/t/tx"
printf ''%s/n'' "[$res]"
Y ahora es el momento para que admita que el echo
funcionará igual de bien para el ejemplo que está preguntando; solo necesitas poner comillas dobles alrededor del argumento:
echo "[$res]"
como escribió kmkaplan (hace dos años y medio, me di cuenta!). El problema con tus comandos originales:
res='' ''x # res = "/t/tx"
echo ''[''$res'']'' # expect [/t/tx]
no es con echo
; es que la cáscara reemplazó la pestaña con un espacio antes de que echo
lo viera.
echo
está bien para una salida simple, como echo hello world
, pero debes usar printf
siempre que quieras hacer algo más complejo. Puede hacer que echo
funcione, pero es probable que el código resultante falle cuando lo ejecute con una implementación de echo
diferente o un shell diferente.
Utilice la combinación de teclas textual, ^V
( CTRL+V
, Cv
, lo que sea ).
Cuando escribe ^V
en el terminal (o en la mayoría de los editores de Unix), el siguiente carácter se toma textualmente . Puede usar esto para escribir un carácter de tabulación literal dentro de una cadena de la que está haciendo eco.
Algo así como las siguientes obras:
echo "^V<tab>" # CTRL+V, TAB
Bash docs ( qv , "quoted-insert")
quoted-insert (Cq, Cv) Agregue el siguiente carácter que escribe a la línea literalmente. Así es como insertar secuencias de teclas como Cq, por ejemplo.
nota al margen: de acuerdo con esto, ALT+TAB
debería hacer lo mismo, pero todos hemos enlazado esa secuencia al cambio de ventana para que no podamos usarla
Insertar pestaña (M-TAB) Insertar un carácter de pestaña.
-
Nota: puedes usar esta estrategia con todo tipo de personajes inusuales. Como 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 escribe ^M
, obtiene el 13er carácter ASCII. Puede verlo en acción usando ls^M
, en un indicador vacío, que insertará un retorno de carro, lo que provocará que el indicador actúe como si presionara regresar. Cuando normalmente se interpretan estos caracteres, textualmente se obtiene el carácter literal.
necesitas usar la bandera -e para el eco, entonces puedes
echo -e "/t/t x"
echo -e '' /t ''
hará eco en ''new tab space newline'' ( -e
significa ''habilitar la interpretación de escapes de barra invertida''):
$ echo -e '' /t '' | hexdump -C
00000000 20 09 20 0a | . .|
res="/t/tx"
echo -e "[${res}]"