Вот мой сценарий, я получаю сообщение об ошибке «строка 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 ответа2

1

Это не cp а [ test который выдает ошибку

0

Кстати, оператор 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .