Não leia todo o arquivo apps.txt em um loop for . No caso geral, isso poderia causar problemas de memória se o arquivo fosse grande, e causaria problemas se algum nome de arquivo em apps.txt tivesse espaços neles. Não faça um loop pela saída de ls . Além disso, cite expansões de variáveis e use printf para gerar dados variáveis.
Relacionados:
- Por que * não * analisar 'ls'?
- Por que o printf é melhor que o eco?
- Por que meu script de shell se sufoca em espaços em branco ou outros caracteres especiais?
- Implicações de segurança de esquecer de citar uma variável em shells bash / POSIX
Sugestão:
#!/bin/sh
appdir='/local/apps/oracle/Middleware/user_projects/epmsystem1/EssbaseServer/essbaseserver1/app'
outdir='/data/shellscripts/essbase/Operate/Overlays'
while IFS= read -r app; do
printf '%s\n' "$app"
for name in "$appdir/$app"/*.rul; do
printf '%s\n' "${name##*/}"
strings "$name"
done
done <apps.txt >"$outdir/rules1.txt"
Isso leria app do arquivo apps.txt e acessaria todos os arquivos *.rul no subdiretório correspondente em $appdir . As seqüências de caracteres $app e ${name##*/} (o nome de base do arquivo *.rul atual) seriam produzidas em cada iteração, junto com a saída de strings . A saída iria para o arquivo $outdir/rules1.txt .
Também relacionado (à minha solução):