Почему мой Bash-скрипт отображает ошибку "слишком много аргументов" в команде cp?
Вот мой сценарий, я получаю сообщение об ошибке "строка 33: [: слишком много аргументов", я запутался, почему, конечно, только 2 аргумента предоставляются здесь cp?
Я предоставляю в каталог две директории без пробелов, то есть $1=dir1/ и $2=dir2/
#!/bin/bash
### Assign suitable names to arguements. ###
source=$1
dest=$2
### Error handler for all script errors. ###
function errorHandler {
case $1 in
ERRargs) printf "USAGE: e2backup source_dir dest_dir.\n"; exit 1;;
ERRsource) printf "ERROR: Source does not exist or is not a directory.\n"; exit 2;;
ERRdest) printf "ERROR: Destination does not exist or is not a directory.\n"; exit 3;;
ERRempty) printf "ERROR: Destination is not empty.\n"; exit 4;;
esac
}
### Test num. of args, source/dest validity and empty dest. Then perform backup. ###
if [ $# -ne 2 ]
then
errorHandler ERRargs
elif [ ! -d $source ]
then
errorHandler ERRsource
elif [ ! -d $dest ]
then
errorHandler ERRdest
elif [ -n "$(ls -A $dest)" ]
then
errorHandler ERRempty
elif [ cp -R $source $dest ]
then
printf "Successfully backed-up from $source to $dest"; exit
else
printf "Back-up failed, please see e2backup.error"; exit 5
fi
2 ответа
Кстати, утверждение cp -R $source $dest
само по себе не является тестовым условием. Так что вы должны сказать BASH выполнить cp
команды. Вы можете использовать обратную цитату или $(...)
и проверить на результат или лучше, как предложено одним комментатором:
if [[ $# -ne 2 ]]
then
errorHandler ERRargs
elif [[ ! -d $source ]]
then
errorHandler ERRsource
elif [[ ! -d $dest ]]
then
errorHandler ERRdest
elif [[ -n "$(ls -A $dest)" ]]
then
errorHandler ERRempty
elif cp -R $source $dest
then
printf "Successfully backed-up from $source to $dest"; exit
else
printf "Back-up failed, please see e2backup.error"; exit 5
fi
Обновлено: BASH поддерживает и "[]" и "[[]]" для теста. Есть немного другое значение, которое любопытный может найти на странице руководства. Кроме того, можно также использовать другие способы проведения теста, такие как test
встроенная команда bash.