$file | grep -o
executa o comando especificado pelo valor de file
e pipes sua saída para% código%. Mas isso claramente não é o que você queria.
Se você deseja listar arquivos que contenham grep
Você quis dizer que o valor de o
é um arquivo de entrada para file
, não um comando para executar. Então você precisa de um redirecionamento de entrada , não um canal.
if grep 'o' <"$file"
grep
lê a entrada padrão se não receber um nome de arquivo em sua linha de comando. Você também pode passar um nome de arquivo na linha de comando; isso faz a mesma coisa.
if grep 'o' -- "$file"
Por que as aspas duplas e por que o grep
no segundo método, consulte Por que meu script de shell sufoca em espaços em branco ou outros caracteres especiais?
Para suprimir a saída de --
, use a opção grep
ou redirecione a saída para -q
.
if grep -q 'o' <"$file"
ou
if grep 'o' <"$file" >/dev/null
Outro problema com o seu script é que /dev/null
define a variável command='ls -l'
para a saída do comando command
, que não é uma lista de nomes de arquivos. Se você se lembra Por que meu script de shell sufocar no espaço em branco ou outros caracteres especiais? , você vai se lembrar que é impossível armazenar uma lista de nomes de arquivos em uma variável string : todos os nomes de arquivos são misturados. Aqui, é ainda pior: há lixo como permissões, datas, etc. A maneira de obter uma lista de nomes de arquivos em um script de shell é usar um padrão curinga .
for file in *
do
if grep -q 'o' <"$file"
then
echo "$file"
fi
done
Tudo isso é equivalente a
grep -l 'o' -- *
Se você deseja listar arquivos cujo nome contenha ls -l
Este recurso está embutido no shell, com padrões de curingas . O padrão o
corresponde a nomes de arquivos que contêm *o*
, portanto, para listá-los, você precisa apenas
ls -l -- *o*
O o
é necessário no caso de um dos nomes de arquivos começar com --
, caso contrário, -
poderá interpretar o nome do arquivo como uma opção.
Se este for um exercício de aprendizado sobre o uso de ls
e você quiser passar o nome do arquivo como entrada para grep
, será necessário usar o comando grep
.
echo "$file" | grep 'o'
O comando echo
pode manejar alguns nomes de arquivos. Por segurança, use echo
. Para saber mais sobre isso e sobre o uso de aspas duplas, consulte Por que meu script de shell sufoca em espaços em branco ou outros caracteres especiais?
printf '%s\n' "$file" | grep 'o'
Como acima, não analise a saída de printf
.
for file in *
do
if printf '%s\n' "$file" | grep -q 'o'
then
printf '%s\n'
fi
done
Se os nomes dos seus arquivos não contiverem novas linhas, você poderá reduzi-lo para.
for file in *
do
printf '%s\n' "$file" | grep 'o'
done
Mais uma vez, o loop é inútil aqui e você pode usar apenas
printf '%s\n' *o*
para imprimir os nomes dos arquivos correspondentes em linhas separadas. O uso de ls
só seria justificado se você precisasse de uma expressão regular de que os padrões de caractere curinga do seu shell não são poderosos o suficiente para serem expressos.