このスクリプトが機能しないのはなぜですか? [閉鎖]

このスクリプトが機能しないのはなぜですか? [閉鎖]
#!/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

以下のようにプロジェクトフォルダの下にサブフォルダの結果を作成しました。

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

ただし、スクリプトを実行すると常にエラーが発生します。

[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)

この問題を解決するのに役立ちますか?

答え1

!=2行目では、条件演算子と引数()の間のスペースを見逃しました1

[ $# != 1 ]

例:

$ set -- foo bar

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

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

$#また、文字列比較を実行する必要があります。たとえば、出力が代わりに表示されるように設計されている(他の変数に置き換える)など、多くの場合失敗します011したがって、算術比較を実行するときは算術比較を使用してください。-neこの場合、演算子は次のようになります。

[ $# -ne 1 ]

または

(( $# != 1 ))

関連情報