在 bash 脚本中使用命令行参数作为 cp 和 mv 的目标

在 bash 脚本中使用命令行参数作为 cp 和 mv 的目标

我试图通过运行带有标志/参数的脚本来复制文件(或重命名文件)以给出源文件名和目标文件名:

#!/bin/bash/

while getopts s:d flag
do
        case "${flag}" in
                s) copy_source=${OPTARG};;
                d) copy_dest=${OPTARG};;
        esac
done

echo "Copy a file input with argument to another file input with argument"
cp $copy_source $copy_dest

输出是一个错误:

sh test_cp.sh -s  file1.txt -d file2.txt
Copy a file input with argument to another file input with argument
cp: missing destination file operand after ‘file1.txt’
Try 'cp --help' for more information.

cp(和mv)不接受参数化目的地吗?我究竟做错了什么?

答案1

如果要接受参数,则您的行中的:后面缺少必需的内容。因此你的是空的,因此抱怨“缺少操作数”。如果您添加“调试”行,例如dwhile getopts-dcopy_destcp

echo "Source parameter: $copy_source"
echo "Destination parameter: $copy_dest"

循环之后,您将看到问题。要解决这个问题,只需添加:

while getopts s:d: flag
do
   ...
done

,请注意,特别是在处理文件名时,您应该始终引用 shell 变量,如

cp "$copy_source" "$copy_dest"

此外,请注意运行脚本

sh test_cp.sh

将覆盖 shebang-line #!/bin/bash并且您无法确定它是在以下环境下运行的bash!如果您想确保使用正确的 shell,您可以明确声明

bash test_cp.sh论点

或者使脚本文件可执行并运行它

./test_cp.sh论点

相关内容