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