$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.