Quero alimentar todas as entradas que correspondam a um padrão usando curingas. Exemplo:
$ cat file_lister.sh
echo $1
$ ls *.txt
file1.txt
file2.txt
file3.txt
$ ./file_lister.sh ./*.txt
file1.txt
Mas eu esperava que meu script fosse impresso
file1.txt
file2.txt
file3.txt
Responder1
Quando você executa seu script:
$ ./file_lister.sh ./*.txt
O shell se expande ./*.txt
para ./file1.txt ./file2.txt ./file3.txt
, então após a expansão você realmente acaba executando:
$ ./file_lister.sh ./file1.txt ./file2.txt ./file3.txt
Seu script imprime o primeiro argumento:
echo $1
$1
corresponde ao primeiro argumento passado para o script, que neste caso é ./file1.txt
- eu esperaria ver isso em vez de apenas file1.txt
(a menos que você realmente tenha executado ./file_lister.sh *.txt
).
Como outros sugeriram nos comentários, se você quiser imprimirtodosdos argumentos em vez do primeiro, há várias coisas que você pode fazer. O mais fácil é mudar $1
(o primeiro argumento) para $@
(todos os argumentos).
#!/bin/bash
printf '%s\n' "$@"
Veresta pergunta no Stack Overflowpara obter mais informações sobre o processamento de argumentos em um script.