1

Поэтому я просмотрел много записей здесь и не могу понять, что я делаю здесь не так. Я новичок в написании сценариев и хочу знать, почему это не работает:

вход

./filedirarg.sh /var/logs fileordir.sh

сценарий

#! /bin/bash
echo "Running file or directory evaluation script"
LIST=$@
if [ -f $LIST ]
then
echo "The entry ${LIST} is a file"
elif [ -d $LIST ]
then
echo "The entry ${LIST} is a directory"
fi

Это приводит к

./filedirarg.sh: line 4: [: /var/logs: binary operator expected
./filedirarg.sh: line 7: [: /var/logs: binary operator expected

Это нормально работает с этим

./filedirarg.sh fileordir.sh 

При цитировании $LIST в результате оценки ничего не выводится, кроме первого оператора echo.

2 ответа2

1

Я думаю, что [ -f … ] (или test -f …) требуется ровно один аргумент. Когда ты бежишь

./filedirarg.sh /var/logs fileordir.sh

есть два. То же самое с [ -d … ] .


Это быстрое решение:

#! /bin/bash
echo "Running file or directory evaluation script"

for file ; do
 if [ -f "$file" ]
 then
  echo "The entry '$file' is a file"
 elif [ -d "$file" ]
 then
  echo "The entry '$file' is a directory"
 fi
done

Благодаря цитированию он должен работать с именами с пробелами (например ./filedirarg.sh "file name with spaces").

Также обратите внимание for file ; do эквивалентно for file in "$@" ; do

0

ожидается бинарный оператор

if [-f $ LIST}

} Должно быть ] , как объяснил ShellCheck:

$ shellcheck myscript

Line 4:
if [ -f $LIST }
^-- SC1009: The mentioned parser error was in this if expression.
   ^-- SC1073: Couldn't parse this test expression.
              ^-- SC1072: Expected test to end here (don't wrap commands in []/[[]]). Fix any mentioned problems and try again.

$ 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .