Por que esse script bash não funciona?

Por que esse script bash não funciona?

Quando executo o seguinte comando

./command *

usando este script

#!/bin/bash

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

apenas o primeiro arquivo especificado em $1 é ecoado. Minha pergunta é por quê?

Responder1

Porque você não usou aspas simples ou duplas ao executar seu comando:

./command '*'

ou:

./command "*"

Ou, se você quiser usar ./command *, faça a seguinte modificação em seu script:

#!/bin/bash

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

Isso porque $1se refere ao primeiro argumento do seu comando e $@se refere a todos os argumentos do seu comando.

Leia também alguma documentação nesse sentido:http://tldp.org/LDP/abs/html/internalvariables.html#APPREF

Responder2

O shell se expande *quando você executa o comando. Portanto, executar o script é equivalente a

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

$1corresponde ao primeiro argumento, portanto o loop possui apenas uma iteração.

Responder3

$1refere-se apenas ao primeiro argumento. Você precisa usar $*.

#!/bin/bash

for f in $*
do
     echo $f
done

informação relacionada