Aqui está como eu faria:
printf "Enter a file name: "
read input
if [ -f "$input" ] ; then
printf "line words chars: %s\n" "$(wc -lwm < "$input")"
fi
Este é o meu script:
echo "Enter a file name:\c "
read input
if [ -f $input ]
then
echo "line words chars:\c "
'echo wc $input'
fi
A saída é a esperada
lines words chars: 4 20 3 test
em que test é um nome de arquivo
mas o problema é que eu não quero produzir um nome de arquivo
não apenas para este exemplo eu quero aplicá-lo para muitos desses scripts
Aqui está como eu faria:
printf "Enter a file name: "
read input
if [ -f "$input" ] ; then
printf "line words chars: %s\n" "$(wc -lwm < "$input")"
fi
No seu caso, não acredito que seja bom restringir a saída a um determinado tamanho, porque sua saída wc
pode ter comprimentos diferentes. No entanto, você poderia fazer isso usando cut
:
Altere a última linha do seu script para
wc "$input" | cut -c 1-6
Isso só produzirá os 6 primeiros caracteres.
Eu acredito, é melhor você usar isso:
wc "$input" | sed -e s/"$input"$//
Isso removerá o conteúdo da variável $input
(no seu caso, o nome do arquivo) da saída. Esta versão ignora o tamanho da saída e pode lidar com sequências de saída mais longas também.
[edit]:
Explicação do segundo comando:
wc "$input" #-> wc command as used before
| #-> redirect output of wc to the next command
sed -e #-> call the program "sed" with the following expression
s/"$input"$// #-> replace everything between / 1 and 2 with everything between / 2 and 3
#->in this case: replace filename with nothing. The second "$" represents the end of the line (so the filename has to be the last element of the line)
A propósito, existem alguns outros erros no seu script:
echo "Enter a file name:\c " -> you don't need the \c
read input
if [ -f $input ] -> you should always quote variables
then
echo "line words chars:\c "
'echo wc $input' -> you should not use echo and '' here, if you want to execute wc
-> you are missing a "fi"
para que esse código funcione:
echo "Enter a file name:"
read input
if [ -f "$input" ]
then
echo "line words chars:"
wc "$input"
fi
A chave para essa questão é o comportamento wc
em relação a um arquivo fornecido como argumento para ler seu conteúdo e com relação a stdin
stream.
Quando wc
tiver um arquivo como argumento, ele imprimirá esse argumento junto com a contagem
$> wc < /etc/passwd
49 75 2575
$> cat /etc/passwd | wc
49 75 2575
$> wc /etc/passwd
49 75 2575 /etc/passwd
Você sempre pode cortar a saída de wc FILENAME
com ferramentas como AWK, cut ou grep, mas isso não é necessário. Falando de AWK
, pode-se fazer algo assim com isso:
$> awk 'BEGIN{ print "Enter filename:" ; getline ; system("wc <"$0) }'
Enter filename:
/etc/passwd
49 75 2575
Mas o script de shell típico ficará assim:
$> echo 'Give me a file' ; read LINE; echo $LINE | xargs wc
Give me a file
/etc/passwd
49 75 2575 /etc/passwd
$> echo 'Give me a file' ; read LINE; wc < "$LINE"
Give me a file
/etc/passwd
49 75 2575
A propósito, não há necessidade de verificar se existe um arquivo. Seu shell ou wc
já fazem isso:
$> echo 'Give me a file' ; read LINE; wc < "$LINE"
Give me a file
asdf
/bin/mksh: can't open asdf: No such file or directory