我正在尝试编写一个 shell 脚本,用户输入他们想要重命名为第一个变量的文件,然后输入他们想要的第二个变量的新名称。程序给出的唯一输出是 mv 缺少文件操作数。我已经碰壁了,目前没有什么可以尝试的。我尝试过使用文件的绝对路径,但这没有帮助。谷歌没有为我找到任何结果。
mv 在命令行中按预期工作,但一旦引入变量,程序就会崩溃。我已经尝试了所有可能的格式化输入的方法。
#!/bin/bash
echo -n "Original filename: "
read $input_filename
echo ""
echo -n "New filename: "
read $output_filename
echo ""
mv -v $input_filename $output_filename
if [ $? == 0 ]
then
echo "Task completed successfully"
else
echo "ERROR: File failed to be renamed. Exiting."
fi
输出及相关文件内容。
davevm@davevm-VirtualBox:~/lab10$ ls
helloworld lab10.sh
davevm@davevm-VirtualBox:~/lab10$ ./lab10.sh
Original filename: helloworld
New filename: copy1
mv: missing file operand
Try 'mv --help' for more information.
ERROR: File failed to be renamed. Exiting.
read
内置命令采用变量名称作为其参数。
使用
read filename
,而不是 read $filename
。
您还应该引用
mv
命令的参数:
mv -v "$input_filename" "$output_filename"
调试 shell 脚本时,将行
set -x
添加到文件顶部通常很有用,该行将在执行时输出所有命令,以准确显示正在发生的情况。使用您的脚本,这样做会显示以下输出:
+ mv -v
mv: missing file operand
嗯,看来您的
$input_filename
和 $output_filename
变量尚未设置。查找 read
的文档,错误变得明显。设置变量名时不应使用 $
作为前缀,因此 read $input_filename
会变为 read input_filename
,读取输出文件名时也是如此
cd /ftp/daily/DWH/ rm -f ACCMAST.DAT rm -f LEGALMAST.DAT cat ACCMAST*.DAT > ACCTMP.DAT cat LEGALMAST*.DAT > LEGALTMP.DAT rm -f ACCMAST*.DAT rm -f LEGALMAST *.DAT mv ACCTMP.DAT ACCMAST.DAT mv LEGALTMP.DAT LEGALMAST.DAT - 错误行 错误:mv:“LEGALTMP.DAT LEGALMAST.DAT”后缺少目标文件操作数