Это мой скрипт:
echo "Enter a file name:\c "
read input
if [ -f $input ]
then
echo "line words chars:\c "
'echo wc $input'
fi
Вывод как ожидалось
lines words chars: 4 20 3 test
, где test - это имя файла
, но проблема в i не хочу выводить имя файла
не только для этого примера, я хочу применить его для многих таких скриптов
В вашем случае я не считаю правильным ограничивать вывод определенной длиной, потому что ваш выход wc может иметь разную длину. Однако вы можете сделать это, используя cut:
Измените последнюю строку вашего скрипта на
wc "$input" | cut -c 1-6
. Это приведет к выходу только первых 6 символов.
Я считаю, что вам лучше использовать это:
wc "$input" | sed -e s/"$input"$//
Это приведет к удалению содержимого переменной $input (в вашем случае имя файла ) с выхода.
[edit]: Объяснение второй команды:
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)
Кстати, в вашем скрипте есть еще несколько ошибок:
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"
, поэтому этот код должен работать:
echo "Enter a file name:"
read input
if [ -f "$input" ]
then
echo "line words chars:"
wc "$input"
fi
Ключом к этому вопросу является поведение wc в отношении файла, заданного как аргумент, для чтения его содержимого и относительно потока stdin.
Когда wc имеет файл в качестве аргумента, он будет печатать этот аргумент вместе с count
$> wc < /etc/passwd
49 75 2575
$> cat /etc/passwd | wc
49 75 2575
$> wc /etc/passwd
49 75 2575 /etc/passwd
Вы всегда можете обрезать вывод wc FILENAME с помощью таких инструментов, как AWK , cut или grep, но это необязательно. Говоря о AWK, можно было сделать с ним что-то вроде этого:
$> awk 'BEGIN{ print "Enter filename:" ; getline ; system("wc <"$0) }'
Enter filename:
/etc/passwd
49 75 2575
Но типичный сценарий оболочки будет выглядеть так:
$> 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
Кстати, есть нет необходимости проверять наличие файла. Ваша оболочка или wc уже делают это:
$> 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