Script de bash: operador binário esperado

1

Então eu revi muitas entradas aqui e não consigo entender o que estou fazendo de errado aqui. Eu sou novo no script e quero saber por que isso não funciona:

entrada é

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

script é

#! /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

Isso resulta em

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

Funciona bem com isso

./filedirarg.sh fileordir.sh 

Citando o $LIST nos resultados da avaliação sem saída, exceto a primeira declaração de eco.

    
por seolchan 09.08.2017 / 19:21

2 respostas

1

Acho que [ -f … ] (ou test -f … ) requer exatamente um argumento. Quando você corre

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

existem dois. O mesmo com [ -d … ] .

Esta é uma solução rápida:

#! /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

Graças a citações, ele deve funcionar com nomes com espaços (por exemplo, ./filedirarg.sh "file name with spaces" ).

Observe também que for file ; do é equivalente a for file in "$@" ; do .

    
por 09.08.2017 / 19:43
0

operador binário esperado

if [ -f $LIST }

O } acima deve ser um ] , conforme explicado em 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.

$ 
    
por 09.08.2017 / 19:45