Problemas com o basic if then statement

0

aprendendo os fundamentos do script e eu tenho essa linha de código:

#!/bin/sh


if [ $# -ne 1]  
then
   echo "Please provide one directory to search"
   echo "Example usage: something.sh directory_name"
   exit 1
fi

no entanto, quando eu corro isso eu recebo o erro if: Expression Syntax. o que exatamente estou faltando aqui? também a próxima instrução if me dá o mesmo erro também: (Eu quero verificar se a variável é um diretório ou não

if [ !-d $1 ]
then
   echo "$1: Invalid Directory. Aborting Script."
   exit 1
fi

script completo, caso isso ajude:

#!/bin/sh
if [ $# -ne 1 ]
then
   echo "Please provide one directory to search"
   echo "Example usage: something directory_name"
   exit 1
fi
if [ ! -d $1 ]
then
   echo "$1: Invalid Directory. Aborting Script."
   exit 1
fi
cd "$1"
read=0
write=0
exe=0
numFiles=0
numDir=0
for filename in *
do
if [ -r filename ]
then
   'expr $read + 1'
fi
if [ -x filename ]
then
   'expr $exe + 1'
fi
if [ -w filename ]
then
   'expr $write + 1'
fi
if [ -f filename ]
then
   'expr $numFiles + 1'
fi
done
for dir in */
do
if [ -r dir ]
then
   'expr $read + 1'
fi
if [ -x dir ]
then
   'expr $exe + 1'
fi
if [ -w dir ]
then
    'expr $write + 1'
fi
if [ -d dir ]
then
   'expr $numDir + 1'
fi
done
total='expr $numDir + $numFiles'
echo "In the directory $1"
echo "  Number of directories     : $numDir"
echo "  Number of files           : $numFiles"
echo "  Number of readable items  : $read"
echo "  Number of writable        : $write"
echo "  Number of executable items: $exe"
echo "-------------------------------"
echo "Total number of items: $total"

UPDATE: Apenas no caso de alguém se deparar com isso, eu tinha comentários de cabeçalho antes do #!/bin/bash que estava causando o erro de expressão if

    
por Tyler Kelly 21.04.2015 / 17:57

2 respostas

1

Você tem alguns problemas. Aqui está a versão de trabalho. Você precisa usar $ para denotar o valor de uma variável ( $filename em vez de filename ) e você precisa atribuir o resultado de uma expressão a uma variável, em vez de apenas invocar a expressão ( read=expr $read + 1 em vez de expr $read + 1 ).

 #!/bin/bash
if [ $# -ne 1 ]
then
   echo "Please provide one directory to search"
   echo "Example usage: assignment4.sh directory_name"
   exit 1
fi
if [ ! -d "$1" ]
then
   echo "$1: Invalid Directory. Aborting Script."
   exit 1
fi
cd "$1"
read=0
write=0
exe=0
numFiles=0
numDir=0
for filename in *
do
if [ -r "$filename" ]
then
   read='expr $read + 1'
fi
if [ -x filename ]
then
   exe='expr $exe + 1'
fi
if [ -w "$filename" ]
then
   write='expr $write + 1'
fi
if [ -f "$filename" ]
then
   numFiles='expr $numFiles + 1'
fi
done
for dir in */
do
if [ -r "$dir" ]
then
   read='expr $read + 1'
fi
if [ -x "$dir" ]
then
   exe='expr $exe + 1'
fi
if [ -w "$dir" ]
then
    write='expr $write + 1'
fi
if [ -d "$dir" ]
then
   numDir='expr $numDir + 1'
fi
done
total='expr $numDir + $numFiles'
echo "In the directory $1"
echo "  Number of directories     : $numDir"
echo "  Number of files           : $numFiles"
echo "  Number of readable items  : $read"
echo "  Number of writable        : $write"
echo "  Number of executable items: $exe"
echo "-------------------------------"
echo "Total number of items: $total"
$ ./script.sh
Please provide one directory to search
Example usage: something.sh directory_name

$ ./script.sh /home/username

In the directory /home/username
  Number of directories     : 8
  Number of files           : 104
  Number of readable items  : 120
  Number of writable        : 120
  Number of executable items: 8
-------------------------------
Total number of items: 112
    
por 21.04.2015 / 18:21
1

O que você está perdendo são espaços.

Isso funciona:

if [ $# -ne 1 ]
then
   echo "One argument needed"
   exit 1
fi

Da mesma forma:

if [ ! -d $1 ] 
    
por 21.04.2015 / 18:02