Crie dados para o seu loop while read
:
#!/bin/sh
if [ "$#" -gt 0 ]; then
# We have command line arguments.
# Output them with newlines in-between.
printf '%s\n' "$@"
else
# No command line arguments.
# Just pass stdin on.
cat
fi |
while IFS= read -r; do
printf 'Got "%s"\n' "$REPLY"
done
Observe que o seu exemplo concat
pode ser feito com o loop while read
substituído por tr '\n' ','
ou similar.
Além disso, o teste -t
não diz nada sobre se você tem argumentos de linha de comando ou não.
Como alternativa, para processar os argumentos da linha de comando ambos e a entrada padrão (nessa ordem):
#!/bin/sh
{
if [ "$#" -gt 0 ]; then
# We have command line arguments.
# Output them with newlines in-between.
printf '%s\n' "$@"
fi
if [ ! -t 0 ]; then
# Pass stdin on.
cat
fi
} |
while IFS= read -r; do
printf 'Got "%s"\n' "$REPLY"
done
Ou, usando a notação curta que algumas pessoas parecem gostar:
#!/bin/sh
{
[ "$#" -gt 0 ] && printf '%s\n' "$@"
[ ! -t 0 ] && cat
} |
while IFS= read -r; do
printf 'Got "%s"\n' "$REPLY"
done