
Aquí hay una parte de mi script que me dice que tengo demasiados argumentos en la línea 3:
#!/bin/bash
export LC_ALL='C'
if [ `echo "*file 2" | grep -o ^.` = '.' ]
then
echo success
fi
¿Alguien sabe por qué? Por lo que puedo decir, solo estoy comparando dos argumentos, "*" y "."
Respuesta1
echo "*file 2" | grep -o ^.
impresiones *
.
Dado que tiene una sustitución de comando fuera de las comillas dobles, se somete a globalización (también conocida como coincidencia de comodines, también conocida como generación de nombre de archivo) y división de palabras. Si el directorio actual no está vacío, *
se expande a la lista de archivos en el directorio actual. Cada archivo se convierte en un token en el [
comando, lo que es muy probable que sea un error de sintaxis.
El problema es que no usaste comillas dobles alrededor de la sustitución del comando.Utilice siempre comillas dobles en las sustituciones de variables y comandosa menos que tenga una buena razón para omitirlos.
if [ "$(echo "*file 2" | grep -o ^.)" = '.' ]
Ver¿Por qué mi script de shell se atasca con espacios en blanco u otros caracteres especiales?para una explicación más detallada.