我试图通过运行带有标志/参数的脚本来复制文件(或重命名文件)以给出源文件名和目标文件名:
#!/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
如果要接受参数,则您的行中的:
后面缺少必需的内容。因此你的是空的,因此抱怨“缺少操作数”。如果您添加“调试”行,例如d
while getopts
-d
copy_dest
cp
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论点