Por que esse script não funcionou? [fechadas]

0
#!/bin/bash
if [ $# !=1 ]
then
   echo Usage: A single argument which is the directory to backup
   exit
fi
if [ ! -d ~/projects/$1 ]
then
   echo 'The given directory does not seem to exist (possible typo)'
   exit
fi
date='date +%F'
if [ -d ~/projectbackups/$1_date ]
then
  echo 'this project has been backed up today, overwrite?'
  read answer
  if [ $answer != 'y' ]
  then
    exit
  fi
else
  mkdir ~/projectbackups/$1_$date
fi
cp -R ~/projects/$1 ~/projectbackups/$1_$date
echo Backup of $1 completed

E eu criei o resultado da subpasta sob a pasta de projetos da seguinte forma:

[root@ip-10-0-7-125 result]# pwd
/root/projects/result

Mas ao executar o script, sempre gera um erro:

[root@ip-10-0-7-125 bash-tut]# ./pj-backup.sh /root/projects/result/
./pj-backup.sh: line 2: [: 1: unary operator expected
The given directory does not seem to exist (possible typo)
[root@ip-10-0-7-125 bash-tut]# ./pj-backup.sh resutl
./pj-backup.sh: line 2: [: 1: unary operator expected
The given directory does not seem to exist (possible typo)

Vocês podem me ajudar como consertar isso, por favor?

    
por The One 13.04.2016 / 03:58

1 resposta

2

Na linha 2, você perdeu um espaço entre o operador condicional != e o argumento ( 1 ):

[ $# != 1 ]

Exemplo:

$ set -- foo bar

$ [ $# !=1 ] && echo "OK"
bash: [: 2: unary operator expected

$ [ $# != 1 ] && echo "OK"
OK

Além disso, você precisa fazer uma comparação de string, que pode falhar em muitos desses casos, por exemplo, e se a saída de $# (substitua isso por outra variável) foi projetada para ser mostrada como 01 em vez de 1 . Portanto, ao fazer comparações aritméticas, use o operador de comparação aritmética, -ne neste caso:

[ $# -ne 1 ]

Ou

(( $# != 1 ))
    
por 13.04.2016 / 04:13

Tags