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