이 스크립트가 작동하지 않는 이유는 무엇입니까? [폐쇄]

이 스크립트가 작동하지 않는 이유는 무엇입니까? [폐쇄]
#!/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

$#또한 문자열 비교를 수행해야 하는데, 예를 들어 (다른 변수로 대체) 출력이 대신 표시되도록 설계된 경우와 같이 많은 경우 실패할 수 있습니다 01. 1따라서 산술 비교를 수행할 때는 산술 비교를 사용하십시오. -ne이 경우 연산자는 다음과 같습니다 .

[ $# -ne 1 ]

또는

(( $# != 1 ))

관련 정보