#bash #shell #unix
#bash #оболочка #unix
Вопрос:
Я относительно новичок в написании сценариев оболочки, и я застрял на этой ошибке уже пару дней. Я пытаюсь прочитать содержимое файла, содержащего список строк и чисел, отформатировать его и вывести количество чисел ниже 50.
Однако все команды работают при вводе в оболочку; в скрипте, когда я пытаюсь передать имя файла в качестве аргумента, я продолжаю получать ошибку «Нет такого файла или каталога».
Вот функция, о которой идет речь:
belowFifty(){
count=0
numbers=`cut -d : -f 3 < "$2"` #here is where the error occurs
for num in $numbers
do
if ((num<50));
then
count=$((count 1))
fi
done
echo $count
}
редактировать: извините, я забыл упомянуть, что скрипт выполняет пару действий. $ 1 — это опция, $ 2 — это файл. Я называю это так:
./script.sh m filename
Ответ №1:
Попробуйте:
$ {2? 2 аргумента требуются для работы ниже пятидесяти} numbers= $( cut -d : -f3 < $ 2 )
Я подозреваю, что проблема в том, что вы вызываете функцию и не указываете 2-й аргумент. Внутри функции $ 2 — это аргумент, переданный функции, а не аргумент, переданный основному скрипту.
Комментарии:
1. Спасибо! Я не знал, что функции принимают свой собственный набор аргументов и использовали аргумент, переданный в скрипт. Это решило мою проблему!
Ответ №2:
Вы указываете "$2"
; что находится в "$1"
том, что передается функции и игнорируется? Я сильно подозреваю, что вы пытаетесь открыть файл с пустой строкой в качестве имени, а такого файла нет — отсюда и сообщение об ошибке. Следствием является то, что вы, вероятно, намеревались ссылаться "$1"
. Если это так, вам, вероятно, следует написать:
numbers=$(cut -d : -f 3 < "$1")
Обычно следует избегать обратной записи в пользу . $(...)
Комментарии:
1. извините, пожалуйста, посмотрите мою правку. Моя вина в том, что я не был ясен. Я также попробовал обозначение $(…), и я все еще получаю ту же ошибку.