¿Por qué este script bash no funciona?

¿Por qué este script bash no funciona?

Cuando ejecuto el siguiente comando

./command *

usando este script

#!/bin/bash

for f in ./$1
do
    echo $f
done

sólo se repite el primer archivo especificado en $1. Mi pregunta es ¿por qué?

Respuesta1

Porque no usaste comillas simples o dobles cuando ejecutaste tu comando:

./command '*'

o:

./command "*"

O, si ciertamente desea utilizar ./command *, realice la siguiente modificación en su secuencia de comandos:

#!/bin/bash

for f in ./"$@"
do
    echo $f
done

Esto se debe a que $1se refiere al primer argumento de su comando y $@se refiere a todos los argumentos de su comando.

Lea también alguna documentación en este sentido:http://tldp.org/LDP/abs/html/internalvariables.html#APPREF

Respuesta2

El shell se expande *cuando ejecuta el comando. Entonces, ejecutar el script es equivalente a

./command file1.txt file2.txt file3.txt

$1corresponde al primer argumento, por lo tanto el bucle solo tiene una iteración.

Respuesta3

$1Sólo se refiere al primer argumento. Necesitas usar $*.

#!/bin/bash

for f in $*
do
     echo $f
done

información relacionada