为什么我的 Bash 脚本在 cp 命令时显示“参数太多”错误?

为什么我的 Bash 脚本在 cp 命令时显示“参数太多”错误?

这是我的脚本,我收到错误“第 33 行:[:参数太多”,我很困惑为什么,这里肯定只为 cp 提供了 2 个参数?

我为脚本提供了两个没有空格的目录,即$1=目录1/$2=目录2/

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

答案1

这不是cp,但[又名test,这给了你错误

答案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 支持使用 '[]' 和 '[[]]' 进行测试。好奇的人可以在手册页中找到略有不同的含义。此外,还可以使用其他方式进行测试,例如使用testbash 内置命令。

相关内容