Почему мой 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 но [ ака test который дает вам ошибку

Кстати, утверждение 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.

Другие вопросы по тегам