Аргумент командной строки для скрипта, изменяющего функции кода пути - PullRequest
0 голосов
/ 08 февраля 2019

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

Работает

for f in /home/student/Downloads/reviews_folder/*
do
    tr -s ' ' '\n' <$f | grep -c '<Author>'
done

Вывод

125
163
33
...

Не работает

for f in "$1"
do
    tr -s ' ' '\n' <$f | grep -c '<Author>'
done

Ввод командной строки

student-vm:~$ ./countreviews.sh /home/student/Downloads/reviews_folder/*

Вывод

125

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

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

Чтобы перебрать все файлы, переданные в качестве аргументов командной строки,

for f in "$@"
do
    tr -s ' ' '\n' <"$f" | grep -c '<Author>'
done

Запустите его как

./countreviews /home/student/Downloads/reviews_folder/*

или, в более общем смысле,

./countreviews ... list of file names ...

Как вы обнаружили, "$1" соответствует первому имени файла в расширенном списке подстановочных знаков.

0 голосов
/ 08 февраля 2019

Если вы используете двойные кавычки для параметра, он должен работать.Вот так:

student-vm:~$ ./countreviews.sh "/home/student/Downloads/reviews_folder/*"

По крайней мере, так у меня работает.Я надеюсь, что это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...