GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puedo verificar los caracteres textuales de una cadena de comando bash?

Podrías usar cat con el -A opción:del manual:

   -A, --show-all
          equivalent to -vET
   -E, --show-ends
          display $ at end of each line
   -T, --show-tabs
          display TAB characters as ^I
   -v, --show-nonprinting
          use ^ and M- notation, except for LFD and TAB

Así que cat -A yourscrip.sh te mostrará personajes invisibles y extraños.


Una opción es mirar los caracteres que está tratando de usar con un visor o editor hexadecimal. hexdump es una buena opción si estás limitado al terminal.

$ hexdump -Cv <<"EOF"
> [ -f /etc/openvpn/client.conf ] && echo true
> EOF
00000000  5b 20 2d 66 20 2f 65 74  63 2f 6f 70 65 6e 76 70  |[ -f /etc/openvp|
00000010  6e 2f 63 6c 69 65 6e 74  2e 63 6f 6e 66 20 5d 20  |n/client.conf ] |
00000020  26 26 20 65 63 68 6f 20  74 72 75 65 0a           |&& echo true.|
0000002d

Puedes ver aquí que el space , close-square-brace , space son correctos - 0x20 , 0x5D , 0x20 .

Estos valores son códigos ASCII, que se muestran en hexadecimal. Cualquier valor fuera del rango 0x20 - 0x7E no es un "carácter imprimible " en lo que respecta a ASCII, y lo más probable es que no funcione bien con las interfaces de línea de comandos.

Nota: Copié tu primer "roto " línea para usar en el hexdump ejemplo anterior, por lo que algo ha reemplazado el no-un-espacio-ASCII con un espacio ASCII entre la fuente original y la pregunta presentada.

Para repetir esto, sigue los siguientes pasos:

  1. Escriba hexdump -Cv <<"EOF" y presione Entrar
  2. Pegue el texto que le gustaría usar
  3. Escriba EOF en una línea propia y presione Enter

Las terminales y las interfaces de línea de comandos no manejan bien los caracteres especiales, como ha descubierto. Si no tiene mucho cuidado con el formato de los documentos, también tendrá problemas con Microsoft Word (y otros) usando "comillas tipográficas ", em-guiones, la lista continúa...

Encuentra la diferencia:(la parte superior es "comillas tipográficas ", la parte inferior es "comillas rectas ")

$ hexdump -Cv <<"EOF"
> “quoted string”
> EOF
00000000  e2 80 9c 71 75 6f 74 65  64 20 73 74 72 69 6e 67  |...quoted string|
00000010  e2 80 9d 0a                                       |....|
00000014

Aquí, las comillas abiertas no son simples comillas ASCII (" ), pero son una serie Unicode/UTF-8 - 0xE2 , 0x80 , 0x9C o U+201C - que la terminal no manejará como cabría esperar.

Sugerencia de Kiwy de cat -A también hace el trabajo:

$ cat -A <<"EOF"
> “quoted string”
> EOF
M-bM-^@M-^\quoted stringM-bM-^@M-^]$

Nota: al usar echo "..." | hd , tiene la posibilidad de que bash sustituya partes de la cadena que está tratando de inspeccionar. Esto es especialmente preocupante cuando se intenta inspeccionar componentes de un script.

Por ejemplo, intente:

$ echo "${USER}"
attie

$ echo "`whoami`"
attie

$ echo "$(whoami)"
attie

$ cat <<EOF
> ${USER}
> EOF
attie

Estos métodos reemplazan componentes con el texto relevante. Para evitar esto, utilice uno de los siguientes enfoques. Tenga en cuenta el uso de comillas simples (' ), y un "quoted heredoc " ("EOF" ).

$ echo '${USER}'
${USER}

$ echo '`whoami`'
`whoami`

$ echo '$(whoami)'
$(whoami)

$ cat <<"EOF"
> ${USER}
> EOF
${USER}

echo "<your command>" | hd Deberia trabajar. Busque retroceso (0x08) o caracteres con códigos>=80. echo "<your command>" | wc -b y verificar que el conteo coincida con lo que ve también es una buena idea.

Copiar cosas de archivos producidos por cualquier cosa con "Office" en su nombre es peligroso, porque dicho software a menudo se toma la libertad de reemplazar caracteres:en francés, busque comillas dobles reemplazadas por "guillemets", en inglés para comillas simples reemplazadas por sus equivalentes abrir/cerrar. El más difícil que encontré fue un espacio de ancho 0 que no se rompe en medio de un nombre de archivo (3 días de tiempo de inactividad del servidor...).


Linux
  1. ¿Cómo verificar si Bash puede imprimir colores?

  2. ¿Cómo puedo recordar el argumento del comando bash anterior?

  3. ¿Cómo puedo agregar una cadena al comienzo de cada archivo en una carpeta en bash?

  4. ¿Cómo puedo ejecutar código PHP desde la línea de comandos?

  5. Cómo agregar un ícono al indicador de bash

Cómo usar el comando Bash let {con ejemplos}

Cómo usar el comando de lectura Bash

bash heredoc

Cómo verificar si una cadena contiene una subcadena en Bash

¿Cómo funciona cat << EOF en bash?

¿Cómo puedo ejecutar manualmente una comprobación de nagios desde la línea de comandos?