Предположим, что имя файла задано в качестве аргумента командной строки. Напишите сценарий оболочки для подсчета строк, символов и слов

Я пытался решить проблему, но не могу решить последнюю часть, где она указана как «Предположим, что имя файла указано в качестве аргумента командной строки».

Напишите сценарий оболочки, который отображает общее количество слов, символов, строк в файле. Предположим, что имя файла задано в качестве аргумента командной строки.

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 тестовых примера, но я прохожу только один тестовый пример, так как не могу решить проблему, предполагая имя файла в качестве аргумента командной строки.

Подсказка: первый аргумент командной строки, передаваемый вашему сценарию, — $1.

larsks 23.03.2019 14:25

не нужно бежать wc три раза. В последнем опечатка!

karakfa 23.03.2019 14:26

Проверьте страницу руководства для wc. Вы обнаружите, что вам не нужны опции. Выполните поиск в Google «как написать сценарий bash с аргументами». Это не трудно.

lurker 23.03.2019 14:43

Никогда не используйте переменную с именем l, так как она слишком сильно похожа на число 1 (неразличима в некоторых шрифтах) и поэтому запутывает ваш код.

Ed Morton 23.03.2019 15:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
16 957
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

Это должно работать. Напишите скрипт 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.

chepner 23.03.2019 16:12
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  

Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно Зачем и/или как этого кода отвечает на вопрос, что улучшает его долгосрочную ценность.

Sneftel 15.07.2019 16:15
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

пожалуйста, исправьте форматирование (как код) и объясните свой код

Pierre.Vriens 12.10.2019 14:10

Пожалуйста, не публикуйте только код в качестве ответа, но включите объяснение того, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением, как правило, более высокого качества и с большей вероятностью привлекут положительные голоса.

Mark Rotteveel 12.10.2019 20:11

Это будет работать

#!/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`"
  1. 1 доллар : первый аргумент (имя файла)
  2. `` (обратные кавычки): используется для выполнения команд
  3. опции: -m : количество символов -w : количество слов -l : количество строк

** Вы также можете использовать этот простой формат **

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" не существует" фи фи

Как сейчас написано, ваш ответ неясен. Пожалуйста, редактировать, чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.

Cristik 04.02.2022 18:39

Другие вопросы по теме