Передача имени файла в скрипт в качестве аргумента. Нет такого файла или каталога

#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. извините, пожалуйста, посмотрите мою правку. Моя вина в том, что я не был ясен. Я также попробовал обозначение $(…), и я все еще получаю ту же ошибку.