Я пытался решить проблему, но не могу решить последнюю часть, где она указана как «Предположим, что имя файла указано в качестве аргумента командной строки».
Напишите сценарий оболочки, который отображает общее количество слов, символов, строк в файле. Предположим, что имя файла задано в качестве аргумента командной строки.
echo
c=$( wc -c < test.txt)
echo "Number of characters in test.txt is $c"
echo
w=$( wc -w < test.txt)
echo "Number of words in test.txt is $w"
echo
l=$( ec -l < test.txt)
echo "Number of lines in test.txt is $l"
Мне пришлось пройти 2 тестовых примера, но я прохожу только один тестовый пример, так как не могу решить проблему, предполагая имя файла в качестве аргумента командной строки.
не нужно бежать wc три раза. В последнем опечатка!
Проверьте страницу руководства для wc. Вы обнаружите, что вам не нужны опции. Выполните поиск в Google «как написать сценарий bash с аргументами». Это не трудно.
Никогда не используйте переменную с именем l, так как она слишком сильно похожа на число 1 (неразличима в некоторых шрифтах) и поэтому запутывает ваш код.





Это должно работать. Напишите скрипт the_script.sh следующим образом:
for F in ${*}
do
echo
c=$( wc -c < ${F})
echo "Number of characters in ${F} is $c"
echo
w=$( wc -w < ${F} )
echo "Number of words in ${F} is $w"
echo
l=$( wc -l < ${F})
echo "Number of lines in ${F} is $l"
done
Чтобы объяснить, ${*} — это все переданные аргументы командной строки, и при использовании с циклом for, как указано выше, каждый аргумент присваивается $F в каждой итерации цикла.
Затем в цикле обратитесь к ${F} как к имени файла.
Бежать:
./the_script.sh text.txt test2.txt ....
Как уже отмечали другие, вам не следует запускать wc три раза, если файлы большие, поэтому вот один из способов запустить его только один раз и обработать подсчеты:
WC=$( wc ${F} )
l=$( echo $WC | awk '{print $1}' )
w=$( echo $WC | awk '{print $2}' )
c=$( echo $WC | awk '{print $3}' )
Вы хотите, чтобы "$@", а не без кавычек $*, обрабатывал все допустимые аргументы. Также нужно цитировать $F.
passed=$1
echo
echo -n "Number of characters in $passed is "
wc -c < $passed
echo
echo -n "Number of words in $passed is "
wc -w < $passed
echo
echo -n "Number of letters in $passed is "
wc -l < $passed
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно Зачем и/или как этого кода отвечает на вопрос, что улучшает его долгосрочную ценность.
for D in ${*}
do
echo
c=$( wc -c < ${D})
echo "Number of Characters in ${D} is $c"
echo
w=$( wc -w < ${D} )
echo "Number of Words in ${D} is $w"
echo
l=$( wc -l < ${D})
echo "Number of lines in ${D} is $l"
done
пожалуйста, исправьте форматирование (как код) и объясните свой код
Пожалуйста, не публикуйте только код в качестве ответа, но включите объяснение того, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением, как правило, более высокого качества и с большей вероятностью привлекут положительные голоса.
Это будет работать
#!/bin/bash
echo "Number of characters in $1 `wc -m < $1`"
echo "Number of words in $1 `wc -w < $1`"
echo "Number of lines in $1 `wc -l < $1`"
** Вы также можете использовать этот простой формат **
for F in test.txt
do
echo
c=$( wc -c < test.txt )
echo "number in test.txt is $c"
done
echo "Number of characters in $1 is $(wc -m < $1)"
echo "Number of words in $1 is $(wc -w < $1)"
echo "Number of lines in $1 is $(wc -l < $1)"
Вам нужно заменить test.txt на $1 при печати. Это очистит оба тестовых примера.
Попробуйте этот, он отлично работает. Все тесты очищены
for F in $*
do
echo
c=$( wc -c < ${F} )
echo "Number in characters in ${F} is $c"
echo
w=$( wc -w < ${F} )
echo "Number in words in ${F} is $w"
echo
l=$( wc -l < ${F} )
echo "Number in lines in ${F} is $l"
done
Используйте это простое решение:
wc -c ${*} | awk '{print "Number of characters in " $2 " is " $1}'
wc -w ${*} | awk '{print "Number of words in " $2 " is " $1}'
wc -l ${*} | awk '{print "Number of lines in "$2 " is " $1}'
По сути, в задаче указано, что имя файла будет передано в качестве аргумента командной строки. Таким образом, вы можете напечатать имя файла, используя этот аргумент командной строки в качестве переменной (это не test.txt для всех тестовых случаев). Вот мой код, который был принят на платформе tekstac:
words=`cat $1 | wc -w`
char=`cat $1 | wc -c`
lines=`cat $1 | wc -l`
echo "Number of characters in $1 is $char"
echo "Number of words in $1 is $words"
echo "Number of lines in $1 is $lines"
введите сюда описание ссылкиecho -e "\n\t\t\tРешение:-" echo -e "\nПроверить, принимается ли имя файла в качестве командной строки аргумент существует в текущем каталоге или нет" если [ $# -eq 0 ] тогда echo -e "\n\tИмя файла не введено" еще если [-е $1] тогда echo -e "\n\t "$1" существует" еще echo -e "\n\t "$1" не существует" фи фи
Как сейчас написано, ваш ответ неясен. Пожалуйста, редактировать, чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.
Подсказка: первый аргумент командной строки, передаваемый вашему сценарию, —
$1.